fork 후 자식프로세스에서 thread 생성.

whatisid의 이미지

파일전송 서버를 만들고 있습니다.

기본적인 fork()로 요청을 처리하고 있는데요. 자식 프로세스에서

소켓 read로 데이터를 받고나면, 그걸 fwrite로 로컬파일에 쓰는 과정을

파일이 다 전송되어 올때까지 반복합니다.

그런데 생각할수록 I/O 문제때문에 한 프로세스로 구현하면 성능이

떨어지는거 같아서, 소켓 read는 자식 프로세스에서 하던대로 하고,

별도의 쓰레드를 만들어 디스크 write는 쓰레드에서 했으면 하는데요.

괜찮은 방법일지요?

또 문제는 이렇게 병렬적으로 가려다 보니까 데이터 queue를 만들어서

소켓 read끝나고 queue에 쌓고, 디스크 write 할때는 queue에서 뽑아내고

하는 작업을 해줘야만 되는데, 이게 오히려 오버헤드가 되지 않을까요?

queue의 malloc과 free의 압박이..-_- 서버인데 메모리 누수가 생기면

치명적일것 같고요.

조언 부탁드립니다^^;

danielkim의 이미지

좋은 방법인것 같습니다 .
우선 memory leak을 걱정하신다면 queue를 만들때 shard memory를 이용해서 대용량 circular queue를 만들어서 처리하시면 문제가 조금은 해결될것 같습니다.
이때 만들어지는 circular queue는 프로세스 갯수 만큼 생성하시는것이 좋습니다. 또한 한번에 전송되는 packet size가 얼마이며 buffering될 packet은
얼마인가 등을 고려해서 queue의 사이즈를 결정하시면 됩니다.
좀 힘들겠지만 생각하시는대로 밀고 나가시면 좋을 결과가 나올 수도 있습니다.
파이팅하세요

liongo의 이미지

FTP 오픈 소스를 참고하시는게 편하실듯합니다..

저만의 생각으론 별차이가 없을듯 싶습니다.

물론 한서버가 딱 한명씩 처리한다면 향상이 생긴다고 생각이 가능하나.

기본적으로 포킹하신다고 한 프로세스당 1 유저 일겁니다..

그렇다면 1:1 상황인데 1:1로 read write 경우 입니다..

보통의 경우 하드에 write보다는 소켓 read가 느립니다. ( 네트웍 속도차)

또한 서버라는 이유로 수십 수백명을 받을경우도

이상태가 훨씬 좋아 보입니다. 적당히 로드발란싱(?) 이 되니까요..

염려하신데로 문제를 만들어보자면..

대역폭 높은 사용자가 들어올경우 giga bit 물론 억측일지도 -_-

하드보다 빠릅니다. 속도가.. 업로드죠.. 이경우 큐에 쌓이는 량이

현저히 많아집니다.. 다 메모리로 들어가죠..

서버가 현저히 바빠지면 하드가 못버팁니다 이경우 다 메모리가 감수해야

합니다.. 파일용량크기가 작지많은 않겟죠?

제 조그만 지식으론 보통 ftp서버가 지금 쓰시는 포킹 1:1 방식인

걸로 알고있습니다. ( 물론 쓰레드 서버도 있구) 나름대로

적합한 상태인것같습니다만.. 다른분들 생각을 어떠실런지..

' 형식이 내용을 규정한다. '

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.