파일 전송 서버의 구현

neoctrl의 이미지

리눅스에서 파일 전송 서버를 구현하려고 합니다.
대략 15~20메가 정도의 파일이 수 만개(계속 늘어납니다.) 정도이고
이 중 하루에 대략 20~30만개 정도의 파일을 클라이언트로 전송합니다.
(일 전송량도 계속 늘어납니다. ^^)

이 경우 리눅스 상에서 효율적인 서버 구조라면 어떤 방식이 될까요?
기본적으로 자주 전송되는 파일에 대해 메모리 캐시를 하고
네트워크 I/O에 있어서 Windows 에서는 Event Select나 IOCP 같은 걸 사용하면 된다고 보는데..
문제는 리눅스라 제가 여기에 대해서는 그다지 아는게 없어서요. ㅠ.ㅠ

일단 책에서는
1. fork를 사용한 멀티 프로세스 서버
2. select를 사용한 멀티플렉싱
3. pthread를 사용한 멀티스레드

정도를 이야기 하는데..
사실 어떤 방법을 써야할지 경험이 없어서 판단하기가 어렵네요. ㅠ.ㅠ

이것저것 찾아보니 kqueue니 epoll이니 하는 것들도 있긴하던데
자세한 설명을 찾기가 힘들고 해서 질문 드립니다.

조언 부탁드려여~ ^^;
참, 이와 유사한 작업을 수행하는 괜찮은 예제(상용으로 써도 괜찮은)가 있으면 자료 위치 좀. ㅠ.ㅠ

amister의 이미지

어줍잖은 경험으로 제 의견 써봅니다.

동시에 백 단위의 클라이언트에 개별적인 처리를 하는 정도라면 thread 정도로 충분합니다만, 일단 말씀하신 사항을 보니 Outbound bandwidth가 굉장히 크고 또한 Object의 사이즈와 수가 많기 때문에 네트워크 I/O 처리 모델보다는 캐시가 성능을 크게 좌우할 것이라고 생각됩니다. 이럴 경우 locking을 고려하다보면, 결국 select나 epoll 등과 non-blocking i/o 등을 사용하는 것이 좀 더 좋은 성능을 낼 수 있습니다.
(locking 해도 상관없다고 구현하기 더 편한 thread 모델을 사용하고 싶으실 수도 있지만, lock 종류가 많아지면서 역시 골치아파지죠...)

캐시가 성능을 크게 좌우할 것이라고 말씀드렸는데, 이 부분에 대해서는 정말 많은 고려가 필요할 것 같습니다. 간단한 캐시를 구현한답시고 Object를 통째로 메모리 캐시에 올려놓고 LRU로 replacement 하는 식으로 구현하시면, 동시에 수백~수천개의 Object를 클라이언트들에게 제공할 경우 제 성능을 발휘못하게 됩니다. 수많은 replacement로 인한 디스크 I/O가 병목이 되겠죠. Object 자체를 작은 Object단위로 나누고 메모리 캐시와 디스크 캐시를 동시에 활용하는 것을 고려해보시면 좋을것 같습니다.

kqueue, epoll, select 등에 대한 자료는 이 게시판에서만 검색해봐도 충분히 자료를 찾으실 수 있습니다.

그리고 말씀하신 서버와 가장 유사한 구조를 가진 것이 CDN 솔루션이나 웹캐시입니다. CDN 과 관련된 오픈소스 프로젝트가 있는지는 잘 모르겠습니다. 웹캐시의 경우는 처리하는 Object 사이즈가 매우 작기 때문에 다소 다른 성격이지만, 기본적으로 네트워크와 디스크 I/O 처리에 대하여 많은 도움을 얻을 수 있습니다. (웹캐시는 I/O 처리 빼면 시체입니다.) 오픈소스 프로젝트로 Squid 나 Oops Cache 등이 있으니 참고하세요.

whatisid의 이미지

저도 경험이 없고, 지금 글을 보고 처음 생각해보는 겁니다.

혹시 FTP 서버-proftpd 등.....을 modify해서 사용하는 건 어떨까요?

괜찮은 방법인지 모르겠네요. 다른 분들의 생각이 무척 궁금합니다!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.