시스템 시간이 너무 많음

시스템 시간이 너무 많음

topCESM(Weather Modeling Application)을 실행할 때 명령이 시스템 호출에 소요되는 시간이 약 25%~60%로 많고 사용자 코드에 소요되는 시간은 40%~75%에 불과하다는 것을 확인했습니다 . 애플리케이션은 일부 I/O를 수행하고 MPI와 통신합니다.

top 명령의 출력 예는 다음과 같습니다.

top - 16:54:32 up 11 days, 13:45,  2 users,  load average: 8.12, 8.25, 8.08
Tasks: 201 total,   9 running, 192 sleeping,   0 stopped,   0 zombie
Cpu(s): 74.3%us, 25.2%sy,  0.0%ni,  0.0%id,  0.0%wa,  0.0%hi,  0.5%si,  0.0%st
Mem:  24659792k total,  5259280k used, 19400512k free,  1747768k buffers
Swap: 28667984k total,   234408k used, 28433576k free,   169080k cached

  PID USER    PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
20748 user1   25   0  516m 304m  26m R 100.2  1.3  22:31.81 ccsm.exe
20750 user1   25   0  497m 293m  26m R 100.2  1.2  27:12.45 ccsm.exe
20754 user1   25   0  496m 290m  24m R 100.2  1.2  27:18.33 ccsm.exe
20751 user1   25   0  496m 291m  25m R 99.9  1.2  27:21.63 ccsm.exe
20752 user1   25   0  496m 291m  25m R 99.9  1.2  27:18.97 ccsm.exe
20749 user1   25   0  686m 446m  26m R 99.2  1.9  26:36.16 ccsm.exe
20753 user1   25   0  554m 335m  25m R 98.5  1.4  27:19.78 ccsm.exe
20755 user1   25   0  496m 289m  23m R 97.2  1.2  27:12.34 ccsm.exe

프로세스 20748에 첨부된 명령을 사용하면 strace많은 것을 알 수 있습니다.

poll([{fd=4, events=POLLIN}, {fd=5, events=POLLIN}, {fd=6, events=POLLIN}, {fd=7, events=POLLIN}, {fd=10, events=POLLIN}, {fd=18, events=POLLIN}, {fd=19, events=POLLIN}], 7, 0) = 0 (Timeout)
poll([{fd=4, events=POLLIN}, {fd=5, events=POLLIN}, {fd=6, events=POLLIN}, {fd=7, events=POLLIN}, {fd=10, events=POLLIN}, {fd=18, events=POLLIN}, {fd=19, events=POLLIN}], 7, 0) = 0 (Timeout)
poll([{fd=4, events=POLLIN}, {fd=5, events=POLLIN}, {fd=6, events=POLLIN}, {fd=7, events=POLLIN}, {fd=10, events=POLLIN}, {fd=18, events=POLLIN}, {fd=19, events=POLLIN}], 7, 0) = 0 (Timeout)

내가 얻는 기간을 사용하여 strace -c -p 20748시간을 계산하면 다음과 같습니다.

$ strace -c -p 20748
Process 20748 attached - interrupt to quit
Process 20748 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 85.17    0.068864           0  11713876           poll
  9.74    0.007876           2      4208           write
  4.45    0.003595           1      6463           munmap
  0.37    0.000302           0      6463           mmap
  0.22    0.000179           0      1068           brk
  0.03    0.000025           1        18           open
  0.02    0.000016           1        18           read
  0.00    0.000000           0        18           close
  0.00    0.000000           0         2         1 stat
  0.00    0.000000           0        18           fstat
  0.00    0.000000           0         2           madvise
  0.00    0.000000           0         1           getcwd
------ ----------- ----------- --------- --------- ----------------
100.00    0.080857              11732155         1 total

폴링에 나타나는 파일 설명자는 소켓과 파이프입니다.

4 -> socket:[2789396]
5 -> socket:[2789451]
6 -> socket:[2789452]
7 -> socket:[2789456]
10 -> pipe:[2789492]
18 -> socket:[2789517]
19 -> socket:[2789518]

여론 조사에 너무 많은 시간이 낭비되는 것 같고 이를 줄이기 위해 할 수 있는 일이 있는지 궁금합니다. 내 첫 번째 생각은 poll전화가 이루어진 곳을 찾는 것이 었습니다 . 애플리케이션의 코드는 poll이를 직접 호출하지 않습니다. 통화 출처를 어떻게 추적하나요? 소켓이 생성된 위치를 어떻게 추적할 수 있나요?

답변1

입력 시간 poll은 낭비되지 않습니다. 프로세스가 입력 데이터가 "도착"되거나 출력 버퍼가 새 출력 데이터를 준비할 때까지 기다리는 시간입니다.

lsof를 사용하여 열린 설명자(소켓 포함)를 나열 할 수 있습니다 .

시스템에 CPU 코어가 몇 개 있습니까? ccsm은 몇 개의 코어를 사용할 수 있습니까?

목록 top에 따르면 ccsm.exe 프로세스의 CPU 사용량은 약 100%입니다. 병목 현상은 I/O가 아니라 CPU인 것 같습니다.

어쨌든 "폴링 시간"을 줄이려면 I/O 속도를 높여야 합니다. 예를 들어 데이터(데이터베이스?)를 빠른 대량 메모리(시스템)에 저장합니다.

관련 정보