0

私が取り組んでいるアプリケーションが突然、サーバーの CPU とメモリを大量に消費しています。この「ペギング」が始まって以来、私はコードを変更していません。何が起こっているのかを調べるためにstraceを掘り下げましたが、出力が実際に何を意味するのかを解読する助けが必要です. CPU使用率が100%で、約1.5GBのメモリを使用して数分間実行されていたpidを1つ取り、strace -cを実行しました。次の出力が得られました。clone コマンドと wait4 コマンドに時間がかかっています。この情報を使って引っ越しの方向を教えてくれる人はいますか?

    % time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 54.10    1.011982      252996         4           clone
 30.67    0.573741          51     11296           brk
 11.98    0.224099       56025         4           wait4
  1.96    0.036701          53       687           munmap
  0.68    0.012642        1580         8           mremap
  0.58    0.010928           2      4886         5 read
  0.01    0.000135           0      2854           fstat
  0.01    0.000112           0       845        25 open
  0.00    0.000073           0       935       115 lstat
  0.00    0.000044           0        97        23 access
  0.00    0.000043           0       464        40 stat
  0.00    0.000037           0       466           write
  0.00    0.000037           0       466           gettimeofday
  0.00    0.000035           0       840           close
  0.00    0.000000           0       173           poll
  0.00    0.000000           0       210           lseek
  0.00    0.000000           0       688           mmap
  0.00    0.000000           0         5           rt_sigaction
  0.00    0.000000           0         5           rt_sigprocmask
  0.00    0.000000           0        16           writev
  0.00    0.000000           0        55           setitimer
  0.00    0.000000           0         2           socket
  0.00    0.000000           0         2         2 connect
  0.00    0.000000           0         4           accept
  0.00    0.000000           0         6           shutdown
  0.00    0.000000           0         4           getsockname
  0.00    0.000000           0        10           setsockopt
  0.00    0.000000           0         2           getsockopt
  0.00    0.000000           0         8           semop
  0.00    0.000000           0        38           fcntl
  0.00    0.000000           0       168           flock
  0.00    0.000000           0        12           getdents
  0.00    0.000000           0        25           getcwd
  0.00    0.000000           0        10           chdir
  0.00    0.000000           0         2           unlink
  0.00    0.000000           0         2           chmod
  0.00    0.000000           0        15           umask
  0.00    0.000000           0         7           times
  0.00    0.000000           0         2         1 futex
  0.00    0.000000           0         4           epoll_wait
  0.00    0.000000           0         6           openat
  0.00    0.000000           0         4           pipe2
------ ----------- ----------- --------- --------- ----------------
100.00    1.870609                 25337       211 total

NEW ---追加情報

これについてさらに情報があります。私のアプリケーションのユーザーが画像をアップロードします。画像がアップロードされるディレクトリには、80k 以上の画像ファイルがアップロードされています。CPUとメモリを大量に消費しているプロセスのstraceを実行すると、そのディレクトリで多くの読み取りが行われ、その後brkが続きます。以下は strace からの抜粋です。

poll([{fd=18, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout)
write(18, "e\2\0\0\3SELECT \"File\".\"ClassName\", "..., 617) = 617
read(18, "\1\0\0\1\0244\0\0\2\3def\4live\4File\4File\tCla"..., 16384) = 11488
read(18, "\0010\0010\00266\10MMSImage\343\0\0D\10MMSImage\02320"..., 16384) = 13032
read(18, "\373\0011\0010\0010\003122\10MMSImage\345\0\0|\10MMSImag"..., 16384) = 11584
read(18, "257\373\0011\0010\0010\003179\10MMSImage\345\0\0\255\10MMSI"..., 16384) = 16384
read(18, "nswer_Image/0_9373043939_1321407"..., 16384) = 16384
read(18, "or question #1054.Eassets/UserCo"..., 16384) = 16384

それから少し後、たくさんのbrk's

brk(0x7f2ba285e000)                     = 0x7f2ba285e000
brk(0x7f2ba291e000)                     = 0x7f2ba291e000
brk(0x7f2ba295e000)                     = 0x7f2ba295e000
brk(0x7f2ba299e000)                     = 0x7f2ba299e000
brk(0x7f2ba29de000)                     = 0x7f2ba29de000
brk(0x7f2ba2a1f000)                     = 0x7f2ba2a1f000
brk(0x7f2ba2a5f000)                     = 0x7f2ba2a5f000
brk(0x7f2ba2a9f000)                     = 0x7f2ba2a9f000
brk(0x7f2ba2adf000)                     = 0x7f2ba2adf000
brk(0x7f2ba2b1f000)                     = 0x7f2ba2b1f000
brk(0x7f2ba2b5f000)                     = 0x7f2ba2b5f000
brk(0x7f2ba2b9f000)                     = 0x7f2ba2b9f000
brk(0x7f2ba2bdf000)                     = 0x7f2ba2bdf000
brk(0x7f2ba2c1f000)                     = 0x7f2ba2c1f000
brk(0x7f2ba2c5f000)                     = 0x7f2ba2c5f000
brk(0x7f2ba2c9f000)

そこで何が起こっているのか誰でも知っています。ディレクトリ内のファイルが多すぎますか? ハードドライブがディレクトリをシークしすぎていませんか?

4

1 に答える 1

0

では、一番上から始めましょう。多くの clone と wait4 は、このアプリケーションが本来よりも多くの fork または threading を実行していることを意味します。

ディレクトリ サイズに関しては、イメージ ファイルから動的に割り当てられたメモリに読み込む場合は、brkより多くのメモリを取得するために を呼び出す必要があります。それは簡単です。

あなたが私に尋ねたら、フォークやスレッドをいくつか取り出してください。

于 2012-12-18T15:26:00.607 に答える