2012-04-02 1 views
0

OS/환경 정보 잠자는 내 프로그램의 모든 스레드를 만듭니다 : 나는 서버 측 프로젝트에서 일하고 있어요Valgrind의는

[email protected]:~$ lsb_release -a 
No LSB modules are available. 
Distributor ID: Ubuntu 
Description: Ubuntu 11.10 
Release:  11.10 
Codename:  oneiric 
[email protected]:~$ uname -a 
Linux sos-build 3.0.0-12-generiC#20-Ubuntu SMP Fri Oct 7 14:56:25 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux 

.

나는이 프로젝트에 몇 가지 문제가 : 나는 문제가 (특히 첫 번째 문제에 대한)입니다 찾을 수 Valgrind의를 사용하도록 제안했다

  1. boost::weak_ptr<T>.lock() Crashes with a SIGSEGV Segmentation Fault
  2. pthread_mutex_lock __pthread_mutex_lock_full: Assertion failed with robust and 0x4000000

. 그래서 저는 Valgrind를 사용하고 있습니다.

valgrind --leak-check=full --gen-suppressions=all --suppressions=valgrind_suppressions.supp MyServerSideProgram arg1 arg2 arg3 arg4

내 프로그램을 동시에 실행 13 개 스레드를 가지고있다. 처음에는 잘 작동합니다. 불행히도 일정 시간이 지나면 모든 스레드가 잠자기 상태가됩니다.

나는 모든 스레드의 상태를 확인하는 데 사용되는 명령 : top -H -p [MyServerSideProgram's PID]

을 그리고 그 결과는 다음과 같습니다 그래서

w: S -- Process Status 
    The status of the task which can be one of: 
    'D' = uninterruptible sleep 
    'R' = running 
    'S' = sleeping 
    'T' = traced or stopped 
    'Z' = zombie 

어떤 생각 :

top - 11:54:34 up 46 days, 22:30, 4 users, load average: 0.02, 0.02, 0.05 
Tasks: 13 total, 0 running, 13 sleeping, 0 stopped, 0 zombie 
Cpu(s): 0.5%us, 0.1%sy, 0.0%ni, 99.2%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st 
Mem: 9224140k total, 8135872k used, 1088268k free, 294988k buffers 
Swap: 9431164k total, 424416k used, 9006748k free, 4973316k cached 

    PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND                                    
8744 plee  20 0 1379m 1.2g 6276 S 0 13.7 31:06.81 memcheck-amd64-                                  
8747 plee  20 0 1379m 1.2g 6276 S 0 13.7 31:42.27 memcheck-amd64-                                  
8748 plee  20 0 1379m 1.2g 6276 S 0 13.7 30:58.15 memcheck-amd64-                                  
8749 plee  20 0 1379m 1.2g 6276 S 0 13.7 31:53.62 memcheck-amd64-                                  
8750 plee  20 0 1379m 1.2g 6276 S 0 13.7 30:58.68 memcheck-amd64-                                  
8751 plee  20 0 1379m 1.2g 6276 S 0 13.7 31:31.65 memcheck-amd64-                                  
8752 plee  20 0 1379m 1.2g 6276 S 0 13.7 31:24.63 memcheck-amd64-                                  
8753 plee  20 0 1379m 1.2g 6276 S 0 13.7 32:05.33 memcheck-amd64-                                  
8754 plee  20 0 1379m 1.2g 6276 S 0 13.7 31:52.24 memcheck-amd64-                                  
8755 plee  20 0 1379m 1.2g 6276 S 0 13.7 31:11.69 memcheck-amd64-                                  
8756 plee  20 0 1379m 1.2g 6276 S 0 13.7 31:17.10 memcheck-amd64-                                  
8757 plee  20 0 1379m 1.2g 6276 S 0 13.7 31:54.65 memcheck-amd64-                                  
8758 plee  20 0 1379m 1.2g 6276 S 0 13.7 32:10.67 memcheck-amd64- 

내가 man top 확인? 감사. 피터

+0

이것이 왜 문제인지는 명확하지 않습니다. 코드에 대해서는별로 알려주지 않지만 모든 스레드는 작업을 기다리고있을 가능성이 큽니다. 'gdb'를 사용하여 프로세스에 연결하고 스레드가 수행중인 작업을 볼 수 있습니다. 'thread apply all where' 명령이 도움이 될 수 있습니다. –

답변

0

데이비드 슈워츠의 말처럼

이 문제

그는 적합한 이유는 분명하지 않다

. 나는 간단한 테스트를했다. 나는 별도의 다른 클라이언트를 만들어서 서버에 연결하고 서버에 명령을 보내고 서버로부터 응답을 받았다. 따라서 서버는 양호한 상태입니다.

즉, 부하 테스트에는 몇 가지 문제가 있습니다. 단지 클라이언트 명령을 서버로 보내지 않습니다.

내 동료 중 한 명이 Java로 그 부분을 썼습니다 (서버는 C++/Boost로 작성되었습니다). 나는 그의 코드를 볼 필요가있다. 많은 시간이 걸릴 것입니다.

부하 테스트 코드에서 뭔가를 발견하면 여기로 돌아올 것입니다.

+0

'코드를 살펴 봐야합니다. 그것은 내 인생의 이야기입니다. (( –