네트웍 서버에서 프로세스는 살아있는데..먹통이 되는 경우..(네

hatbary의 이미지

안녕하세요..
레드햇 리눅스 8.0, 커널 2.4.18-14smp 환경에서 서버를 만들고 있는데요..

단순한 prefork형식의 서버거든요..그니깐 5개의 서버가 prefork되구, 각각의 프로세스는 select collision을 방지 하는 accept로 연결을 기다립니다..(stevens아저씨의 첫번째 prefork서버 모델의 변형인걸로 기억남)

얘가 잘 돌고 있다가 어느순간(규칙적이지는 않습니다) 프로세스는 살아있고, 연결을 못받아들이는...그런 상태가 됩니다..

tcpdump로 보면 트래픽은 계속 들어오거든요..그리고 네트웍 트래픽이 그다지 많은 상황에서만 일어나는건 아니거든요..
네트웍 트래픽이 별로 없을때도 그런 현상이 생기는데...

처음에는 one-thread-per-client형태로 만들었다가 위와같은 현상이 일어나서 스레드 만들때 리소스가 없어서 그러나 싶어 prefork모델로 바꾼거거든요..

그런데도 이런 현상이 나타나니..흠..이유를 알수가 없네요..

어떤 이유로 이런 현상이 발생하는지, 나름대로 해결할수 있는 방안은 무엇인지 알려주시면 정말 고맙겠습니다...

그리고 추가적으로 하나만 더 질문 드린다면..이런한 서버의 상태를 감지 할수 있는 방법은 있는지 궁금합니다..

그럼 고수님들의 답변에 미리 감사드리면서..꾸벅

서지훈의 이미지

preforking 구조를 어떻게 잡으셨는지요?
보통은 유효수의 프로세스와 최대 프로세서의 수에 제한을 두어 사용을 하는데...
예를 들어...
처음 시작에는 10개의 프로세스가 돌가고 있는데...
8개 정도가 서비스 중이면 5개 정도를 미리 더 만들어 준다던지...
그리고 이 생성 갯수도 최대치를 주어 이 이상은 서비스 불능이 되겠죠...
그리고 20정도의 프로세스가 있는데...
실제 서비스 되는건 5개 정도라면...
다시 10개로 줄이고...
이런 유연한 체계로 구성을 하셔야 문제없이 운영이 될거 같네요.

그렇지 않으면...
5개로 한정하여...
backlog가 얼마나 될진 몰라도...
서비스 요청이 10개, 20개 이런식으로 들어오게 되면 유효한 몇개만 접속되고 대기상태로 들어가고...
나머진 denied 되겠죠...

이런 부분에 문제가 있지않나 생각이 드네요...
한번 전체적으로 이런 오류를 가지고 있지 않나 보시길...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

jongi의 이미지

각 프로세스가 어떤짓을 하고 있는지 살펴볼 필요가 있을 듯 합니다.

strace 명령으로 어떤 상태에서 동작이 멈추어 있는지 확인하시고, 디버거로 디버깅하시면 도움이 되실 듯 합니다.

--
종이한장 * 이성으로 비관하더라도 의지로 낙관하라! (그람시)

hatbary의 이미지

흠...각각의 프로세스의 처리시간이 짧기때문에..고정된 수의 프로세스를 만들면 프로세스가 마치 라운드 로빈방식처럼 순차적으로 처리할거라는 짧은 생각으로 만든거거든요..백로그를 좀 큰값이지만 100으로 설정해놔서 충분히 각각의 요청에 대해 처리가 가능할거라 생각해서 만든거거든요..

그렇다면 서지훈 님이 말씀하신 다이나믹하게 서비스 중인 프로세스를 감지하고 프로세스를 만들고 죽이는 방법(이게 아파치가 쓰는 방법이져?)은 어떤 식으로 할수 있을까요? 제가 예전에도 아파치 소스를 보긴 봤는데...도통 알수가 없어서리..^^;;

서지훈의 이미지

이거의 구현은 preforking을 사용한다면...
semapore와 shared-memory로 구현이 가능합니다.
shared-memory에는 모든 프로세스 상황을 기록하고...
semaphore로 shared-memory에 대한 접근을 막아 주면 원하시는 기능 구현이 가능할거 같군요...

이게 좀 머리가 아프시더라도...
함번 구현을 해보시면 앞으로의 일에 또 많은 도움이 될거 같네요...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

hatbary의 이미지

흠...그렇군요....제가 아직 초보라서 자꾸 질문이 쏟아지는데...

그렇다면 prefork로 5개정도 프로세스를 만들구, 각각의 프로세스가 poll이나 select를 이용하여 accept를 사용한다면 어떨까요??

그리고, 스레드 풀을 마니 사용하던데..스레드 풀을 사용하는건 또 어떨까요?

서버에 여러 모델이 있는데, 여기 올라온 글들도 읽어봤는데, 아직 내공이 부족하여, 잘 이해를 못하구 있네요..

고수님들의 의견을 듣고 싶습니다..

이렇게 답변계속 꾸준히 주시니 넘 고맙네요..^^

서지훈의 이미지

제가 앞에 설명을 드린건 prefoking에 대한 설명 이었구요...
다른 방법으로 하실려면...
다른 대안들은 무지 많습니다...
제가 이들을 다 열거 할 수도 없을 뿐더러 설명을 드리기도 힘이 부치네요...
걍... 이것저것 열심히 잘 찾아 보세요...
처음부터 모든게 자신에 입맛에 맞는건 찾기 힘드니...
이정도 노력은 있어야 할듯...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

hatbary의 이미지

네..답변 고맙습니다...^^

댓글 달기

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