システム時間が多すぎます

システム時間が多すぎます

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速度を上げる必要があります。たとえば、データ(データベース?)を高速バルクメモリ(システム)に保存します。

関連情報