멀티쓰레드를 이용한 다중접속 socket서버에서 문제....

hitman7의 이미지

제목에 표시된 대로의 프로그램입니다.

상황은 서버를 실행 시킨후 aging을 걸기위하여 10초 주기로 접속을 한후 냅다 접속을 끊어버리는 윈도그용 클라이언트 어플리케이션을 10개 가량 실행 합니다.

처음에는 잘 동작하다가 한 5분 후부터 응답을 보내지않고 뻗어버리네요. 뻗기전에는 소켓들도 잘 해제하다가 뻗자마자 소켓들이 CLOSE_WAIT 상태에 빠져 버리고요.

가능하시면 다른 조언들도 부탁드리겠습니다.
(실행중에 메모리가 계속 차네요...메모리 릭이라도 있는걸까...워낙 단순해서 없을것 같은데 말이죠..)

소스가 써지질 않아서..첨부합니다..ㅠ,.ㅠ
main은 서버측이고
client.c는 10초마다 불리워지는 함수입니다. 윈도우측이고요.

File attachments: 
첨부파일 크기
Plain text icon main.c.txt2.02 KB
Plain text icon client.c.txt537바이트
wariua의 이미지

혹시나 싶어서 그러는데, main()에서 accept()를 하고서 자식 스레드에게 &sock_c를 넘겨주는 것, 위험하지 않을까요? 자식 스레드가 시작되기 전에 주스레드가 또 다른 연결을 accept()해서 sock_c값이 바뀌어 버리면 소켓 하나가 둥둥 뜨게 되고, 다른 소켓 하나는 두 스레드가 동시에 사용하게 될 테니까요.
----
$PWD `date`

$PWD `date`

hitman7의 이미지

혹시나 싶어서 그러는데, main()에서 accept()를 하고서 자식 스레드에게 &sock_c를 넘겨주는 것, 위험하지 않을까요? 자식 스레드가 시작되기 전에 주스레드가 또 다른 연결을 accept()해서 sock_c값이 바뀌어 버리면 소켓 하나가 둥둥 뜨게 되고, 다른 소켓 하나는 두 스레드가 동시에 사용하게 될 테니까요.

흠. 그것은 문제겠네요. 메모리가 새는 부분이 될수 있겠습니다. 하지만 5분 만에 뻗는것이 영. 메모리를 한 10메가 정도 쓴다음에 뻗으니깐요. 조치 해보도록 하겠습니다. 감사합니다.

		pthread_mutex_lock(&mutx);
		sock_c=accept(sock_s,(struct sockaddr*)&addr_c,&addr_len);
		pthread_mutex_unlock(&mutx);

와 같이 했는데 증상은 나아지지 않았네요.. :(

far and hard way

ㅡ,.ㅡ;;의 이미지

위에님이 지적하신문제는 적용하신코드로는 해결되지 않습니다.
다른어떤방법을 강구하셔야합니다.
뭐간단히는 Thread call 다음에 usleep 를 주는방법도 있지만.
저같으면 sock 이 int 인점을 착한하여 Call by reference보다 Direct 로 값을 넘겨줄수가 있겠죠..

물론 님이 10초에 한번씩 콜한다고 하셧나요? 그러면 매우긴시간이기때문에 위에서 그문제가 아닐가능성은높지만..말이죠..


----------------------------------------------------------------------------

mach의 이미지

5분후에 서버가 이상동작한다면, 약 1분 경과 부터, 4분까지 1분정도 단위로 netstat -na해서 특이 사항을 올려주세요. 혹시나 해서 말입니다. ㅎ
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

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

hitman7의 이미지

5분후에 서버가 이상동작한다면, 약 1분 경과 부터, 4분까지 1분정도 단위로 netstat -na해서 특이 사항을 올려주세요. 혹시나 해서 말입니다. ㅎ

별 특이 사항은 없습니다..
서버가 동작하는 상황에서는
포트에 일반적인 연결이 되어 있는 상황 즉 ESTABLISHED 로 몇개가 떠 있습니다. (접속보다는 적게..워낙 접속을 하자마자 끊어지니깐요)
그러다가 서버가 동작을 멈추게되면
당연한 이야기이지만 접속을 처리하지 못하여 클라이언트를 종료 시키지 않은한 계속해서 CLOSE_WAIT 상태가 나타납니다.

아래는 서버가 정상 동작중일 때의 netstat -an의 결과입니다.

tcp        0      0 0.0.0.0:7575            0.0.0.0:*               LISTEN     
tcp        0      0 192.168.201.42:7575     192.168.201.41:2718     ESTABLISHED
tcp        0      0 192.168.201.42:7575     192.168.201.41:2716     ESTABLISHED
tcp        0      0 192.168.201.42:7575     192.168.201.41:2717     ESTABLISHED
tcp        0      0 192.168.201.42:7575     192.168.201.41:2714     ESTABLISHED
tcp        0      0 192.168.201.42:7575     192.168.201.41:2715     ESTABLISHED

아래는 서버가 동작을 멈춘후의 netstat -na의 결과 입니다.

tcp        1      0 192.168.201.42:7575     192.168.201.41:1945     CLOSE_WAIT 
tcp        0      0 192.168.201.42:7575     192.168.201.41:1958     ESTABLISHED
tcp        1      0 192.168.201.42:7575     192.168.201.41:1956     CLOSE_WAIT 
tcp        1      0 192.168.201.42:7575     192.168.201.41:1957     CLOSE_WAIT 
tcp        1      0 192.168.201.42:7575     192.168.201.41:1954     CLOSE_WAIT 
tcp        1      0 192.168.201.42:7575     192.168.201.41:1955     CLOSE_WAIT 
tcp        1      0 192.168.201.42:7575     192.168.201.41:1952     CLOSE_WAIT 
tcp        1      0 192.168.201.42:7575     192.168.201.41:1953     CLOSE_WAIT 

far and hard way

harisoo의 이미지

쓰레드 함수내에

변수 선언후..
pthread_detach(pthread_self()); <-- 이걸 추가해보세요.,,,

hitman7의 이미지

쓰레드 함수내에
 
변수 선언후..
pthread_detach(pthread_self());

현재 30개 연결에 15분간 버티고 있습니다. 감사합니다 :)
그런데 여기에서 질문이 하나 더 있습니다.
쓰레드가 종료되는 순간 쓰레드에서 사용되는 자원이 반환이 되어야 하는게 정상일텐데요. 왜 굳이 pthread_detach()를 사용해야 문제점이 없어지게 된걸까요? 어떠한 상황에서
return 0;
pthread_exit();
pthread_detach();
를 사용해야 할까요?

far and hard way

mach의 이미지

쓰레드 관련하여 아래글을 참고하세요.
http://kldp.org/node/60444
http://kldp.org/node/63142

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

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

harisoo의 이미지

Call by reference 문제가 아니라.. 쓰레드가 생성된후 종료되는 과정이 문제인거 같습니다..

제가 pthread_detach(pthread_self())를 조언한것은 이렇게 하면 쓰레드가 함수 실행후 알아서 종료하기 때문입니다.

하지만 이렇게 안하고 pthread_join()같은것으로 나갈려면 쓰레드가 종료댈때까지 기다려 줘야합니다.

ㅡ,.ㅡ;;의 이미지

물론 문제의 증상은 call by reference 에의한 문제는 아닌것으로 보입니다.
하지만 누가 맨처음 지적하셨듯이 그곳에는 치명적인문제가있습니다.


----------------------------------------------------------------------------

lovewar의 이미지

while(1)
{
    addr_len=sizeof(addr_c);
    sock_c=accept(sock_s, (struct sockaddr *)&addr_c, &addr_len);
    pthread_create(&p_thread, NULL, (void *) con_from_c, (void *) &sock_c);
}

p_thread 변수가 맘에 걸립니다.
쓰레드를 생성할때, 매번 p_thread의 공간을 만들어 줘야 하지 않나요?

sysmute의 이미지

예전에 저도 HP에서 잘 돌아가던 소스를 레드햇 9에 포팅을 한 적이 있었습니다... HP에서는 잘 돌아갔는데 리눅스에서는 어느 순간에 모든 프로세스가 락이 걸리는 겁니다... 그 문제로 1주일동안 고민하다가 NPTL의 적용여부에 따라서 리눅스에서의 쓰레드 동작 방식이 다르다는 것을 알았지요... 그래서 레드햇 9에서 레드햇 엔터프라이즈 3이상으로 OS를 업그레이드 했습니다... 별다른 문제없이 죽지도 않고 잘 돌아갔습니다... 리눅스에서의 작업이라면 그리고 쓰레드를 사용하시니깐 NPTL을 의심해볼만도 합니다... 아는것이 없어서 이정도밖에... *^^*

---------------------------------------------------------------------
여기가 어디지? 집에는 갈 수 있을까?

여기가 어디지? 집에는 갈 수 있을까?

Anonymou의 이미지

pthread_create 함수의 리턴값을 체크하세요.

루믹서의 이미지

mutex락을 사용하지 않고...
sock = accept(...); 후에
sockd = dup(sock); 후에
pthread_create(...., (void *) &sockd); 해줘도 됄꺼 같은데요..^^;;
마지막으로 close(sock); 해주고요^^;;

댓글 달기

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