프로세스 생성갯수 제어에 관한 질문입니다.

shs0917의 이미지

Packet_Capture라는 함수를 일단 데몬화 시켜서 프로세스 생성하구요..
Packet_Capture 내에서 Pcap_loop라는 함수가 Packet 처리 함수로써
Create_Detector라는 함수를 호출해서.. Create_Detector라는 함수가
호출될 때마다 Detector를 하나씩 생성하게 되는데요.. 이때 Detector를
한번에 20개(설정은 바뀔수 있습니다.) 이상은 생기지 않도록 제어를 하고
싶은데요... 생성되어 있는 프로세스의 카운터를 할 수 있는 효과적인 방법을
알고 싶습니다. 그리고 fork된 프로세스의 자원을 확실히 반환할 수 있는 방법도
알고 싶습니다.

mach의 이미지

shs0917 wrote:
Packet_Capture라는 함수를 일단 데몬화 시켜서 프로세스 생성하구요..
Packet_Capture 내에서 Pcap_loop라는 함수가 Packet 처리 함수로써
Create_Detector라는 함수를 호출해서.. Create_Detector라는 함수가
호출될 때마다 Detector를 하나씩 생성하게 되는데요.. 이때 Detector를
한번에 20개(설정은 바뀔수 있습니다.) 이상은 생기지 않도록 제어를 하고
싶은데요... 생성되어 있는 프로세스의 카운터를 할 수 있는 효과적인 방법을
알고 싶습니다. 그리고 fork된 프로세스의 자원을 확실히 반환할 수 있는 방법도
알고 싶습니다.

다수개의 작업자가 아주 빠르게 생산되는 작업을 처리하는 프로그램을 작성하시는데는, 실시간성에 대한 검증이 필요합니다. 과연 쓰레드를(또는 프로세스를) 증가한다고, 그것을 실시간에 처리할 수 있는가? 라는 문제를 풀어야 합니다.
이문제는 프로그램으로 풀어서는 안되고 손으로 수학문제 풀듯이 풀어야 합니다.
단지, 큐(queue)를 사용하여 이 문제를 해결하는 방법이 있습니다.
1) 고정된 개수 (n)개의 워커를 생성한다.
2) 생산자는 매 작업을 큐에 삽입한다.
3) 워커들은 큐에서 작업을 꺼내서 처리한다.

생산자의 생산속도 >> 소비자(워커)의 소비속도
라면 아주 곤란하게 됩니다. n을 증가시킨다고 처리속도가 빨라지는것은 아니기 때문입니다. 무조건 n을 증가시키면 속도는 오히려 떨어질 수도 있습니다.
큐는 무한히 커질 수 있기때문에 데이터베이스를 사용하게 되며(메모리데이터베이스;실시간데이터베이스) 생산자 레벨에서 어느정도의 필터링을 해서 처리대상을 선별할 필요가 있을 수도 있습니다.

두서없는 내용을 정리하자면,
1) 쓰레드풀 또는 프로세스풀을 구성한다.(n개)
2) 생산자와 소비자간에 큐(queue)를 구현한다.
3) 생산자의 생산속도, 소비자의 소비속도를 실험또는 검증하여, 1) 및 2)의 크기를 산정한다.
4) 3)이 불가능한 경우 시스템 업그레이드(보다 빠른 CPU, 보다 많은 메모리, 로드밸런싱)를 고려한다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

shs0917의 이미지

사실 제가 큐니 스택이니 자료형은 거의 까막눈이에요.. 그쪽은 잘 모르겠구요..

지금 만드는 프로그램에서 생산속도 > 소비속도인것은 어쩔수 없습니다.

소비속도가 더 느린것은 이더넷에서 들어오는 패킷의 양이 엄청나고.. 거기에

따른 loss를 0%로 만들수 없다는 얘기가 되겠죠..

그래서 소비자를 일정갯수 정해진 만큼만 유지를 시키구요.. 즉 Detector가

되겠죠.. Detector의 수를 제한하구요 이것들의 처리가 끝나지 않아서..

제한을 둔 갯수만큼의 Detector가 생성되어 있다면.. 더이상의 생산품..

즉 패킷은 그냥 무시를 하겠다는 의도입니다. ^^

답변 부탁 드립니다.^^

그리고 확실히 이것의 성능은 수학적으로 증명하는 방법 뿐이겠네요..

다수의 프로세스가 있어도 단일 CPU이기 때문에 반드시 성능이 향상되는

것이 아닐테니.. 그리고.. 실시간이면 좋겠는데.. 그건 아직 해결되지 않은

문제로 알고 있습니다. 언젠간 실시간으로 탐지할 수 있는 기술이 생기겠죠..^^

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

partout의 이미지

생성되어 있는 프로세스의 수는 Create_Detector 함수 내에서 Detector를
하나 생성할 때마다 count를 하나 증가시키고, Detector의 실행이 끝나면 count를 하나 줄이면 될 거 같습니다만...
상당히 비효율적이란 생각이 드네요.

약간 힘드시더라도 mach님이 제안하신 방법대로 구현하는 것이 좋을 것 같습니다.
프로세스나 쓰레드를 생성/소멸하는 것은 shs0917님이 생각하시는 것보다
부하가 큰 편입니다..
Detector에서 어떠한 처리를 하는지는 잘 모르겠지만,
심한 경우, ... 실제 패킷을 Detector에서 처리하는 시간보다 프로세스나 쓰레드를
생성/소멸하는 데 더 많은 시간을 소비하게 될 지도 모릅니다.

어찌나 졸린지..~~

shs0917의 이미지

생각해보니 프로세스 생성하고 종료하는데 쓸데없이 많은 오버헤드가
발생해 버릴지도 모르겠군요...
차라리 시스템 성능에 따라 Detector의 갯수를 설정해주고..
예를 들어 10개라고 설정을 한다면.. 한번에 10개를 미리 생성하고..
패킷이 있을때 마다 대기상태의 Detector에게 처리할 데이터를 넘겨주는건
어떨까 하는 생각을 해봤습니다.
이렇게 한다면 적어도 처음 실행때만 프로세스를 생성하면 되고..
처리가 끝난 프로세스를 다시 종료하는 것이 아니라.. 처리할 데이터가 있을때
까지 대기상태에 들어가 있는 거니까.. 조금은 개선되지 않을까요??
Detector를 패킷이 들어올 때마다 생성하고 종료 시키더라도 패킷이 끝없이
들어오니까.. 결국엔 항상 10개가 실행되고 있겠네요..
결국.. 그냥 첨부터 제한 갯수의 Detector를 띄워 놓는것이 좋을거란...
여기에 대한 의견 부탁 드립니다.

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

voidns의 이미지

shs0917 wrote:
생각해보니 프로세스 생성하고 종료하는데 쓸데없이 많은 오버헤드가
발생해 버릴지도 모르겠군요...
차라리 시스템 성능에 따라 Detector의 갯수를 설정해주고..
예를 들어 10개라고 설정을 한다면.. 한번에 10개를 미리 생성하고..
패킷이 있을때 마다 대기상태의 Detector에게 처리할 데이터를 넘겨주는건
어떨까 하는 생각을 해봤습니다.
이렇게 한다면 적어도 처음 실행때만 프로세스를 생성하면 되고..
처리가 끝난 프로세스를 다시 종료하는 것이 아니라.. 처리할 데이터가 있을때
까지 대기상태에 들어가 있는 거니까.. 조금은 개선되지 않을까요??
Detector를 패킷이 들어올 때마다 생성하고 종료 시키더라도 패킷이 끝없이
들어오니까.. 결국엔 항상 10개가 실행되고 있겠네요..
결국.. 그냥 첨부터 제한 갯수의 Detector를 띄워 놓는것이 좋을거란...
여기에 대한 의견 부탁 드립니다.

제 생각에도 프로세스를 계속 생성하고 종료할 필요가 있을까란 생각이 드네요
어차피 연속된 패킷을 캡쳐하면서 제한수까지 금새 차버릴 텐데
계속 생성/제거할 필요가 없을 거 같네요!
저도 님의 생각에 한 표입니다.
지리즈의 이미지

큐냐 메세징 레이어를 새로 구축하는 것 보다는
ACE나
msgconnect 와 같은 공개형 라이브러리를 이용하심도 편하실 것 같습니다.

모두 cross platform을 지향하고 있어서...
다양한 운영체제와 다양한 언어에서 개발할 수 있는 장점이 있습니다.

There is no spoon. Neo from the Matrix 1999.

낙엽의 이미지

shs0917 wrote:
생각해보니 프로세스 생성하고 종료하는데 쓸데없이 많은 오버헤드가
발생해 버릴지도 모르겠군요...
차라리 시스템 성능에 따라 Detector의 갯수를 설정해주고..
예를 들어 10개라고 설정을 한다면.. 한번에 10개를 미리 생성하고..
패킷이 있을때 마다 대기상태의 Detector에게 처리할 데이터를 넘겨주는건
어떨까 하는 생각을 해봤습니다.
이렇게 한다면 적어도 처음 실행때만 프로세스를 생성하면 되고..
처리가 끝난 프로세스를 다시 종료하는 것이 아니라.. 처리할 데이터가 있을때
까지 대기상태에 들어가 있는 거니까.. 조금은 개선되지 않을까요??
Detector를 패킷이 들어올 때마다 생성하고 종료 시키더라도 패킷이 끝없이
들어오니까.. 결국엔 항상 10개가 실행되고 있겠네요..
결국.. 그냥 첨부터 제한 갯수의 Detector를 띄워 놓는것이 좋을거란...
여기에 대한 의견 부탁 드립니다.

쓰레드풀에 한표~

shs0917의 이미지

어차피 CPU가 한번에 하나의 처리밖에 할 수 없으니까..
Detector를 여러개 나눠서 실행하는 것 보다 그냥 한개로 실행하는게
더 효과적이지 않을까요?? 어차피 Detecting 속도를 높이려고 하는 거니까..
차라리 여러개의 Detector를 생성하지 않는것이 더 빠를듯 한데요..
정확한 예측이 힘드네요.. 좋은 의견 부탁 드립니다.

컴퓨터가 이해할수 있는 코드는 어느 바보나 다 작성할 수 있다. 좋은 프로그래머는 사람이 이해할 수 있는 코드를 짠다 - 마틴파울러

댓글 달기

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