我观察到,在运行CESM (天气建模应用程序)时,top命令显示系统调用花费了大量时间,大约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使用strace命令附加到进程20748显示了大量的
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。我怎样才能追溯到电话的来源?如何追溯到创建套接字的位置?
发布于 2014-04-01 19:11:40
poll中的时间不会被浪费--这是进程等待输入数据“到达”或输出缓冲区为新的输出数据做好准备的时候。
您可以使用lsof列出开放描述符(包括套接字)。
系统中有多少CPU核?ccsm可以使用多少个核心?
您的top清单显示了ccsm.exe进程大约100%的CPU使用率。在我看来,您的瓶颈不是I/O,而是CPU。
无论如何,为了减少“轮询时间”,您需要加快I/O速度--例如,通过放置数据(数据库?)在快速大容量存储器(系统)上。
https://unix.stackexchange.com/questions/122613
复制相似问题