【问题标题】:cpu pegged, memory pegged, strace outputcpu 挂钩,内存挂钩,strace 输出
【发布时间】:2012-12-17 22:11:50
【问题描述】:

突然间,我一直在开发的一个应用程序正在破坏服务器的 CPU 和内存。自从这种“挂钩”开始以来,我没有任何代码更改。我对 strace 进行了一些研究,试图找出发生了什么,但我需要帮助来解读输出的真正含义。我拿了一个运行了几分钟的 pid,cpu 使用率为 100%,使用了大约 1.5GB 的内存,并用它运行了 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

新---附加信息

我有更多关于这方面的信息。我的应用程序的用户上传图片。图像上传到的目录现在已经上传了 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 的

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)

任何人都知道那里可能会发生什么。我的目录中是否有太多文件或类似的东西?硬盘是否需要过多地寻找目录?

【问题讨论】:

  • 我对此有更多信息。我的应用程序的用户上传图片。图像上传到的目录现在已经上传了 80k 多个图像文件。当我对占用 cpu 和内存的进程进行 strace 时,我会在该目录中读取大量数据,然后是 brk。以下是 strace 的摘录。

标签: memory-management cpu strace


【解决方案1】:

好吧,让我们从顶部开始。大量的 clone 和 wait4 意味着这个应用程序比它应该做的更多的分叉或线程。

关于目录大小,如果你从图像文件中读取到动态分配的内存中,必须调用brk 来获取更多内存。就这么简单。

如果你问我,只需取出一些叉子或螺纹即可。

【讨论】:

  • 好的,我搞定了克隆和表单的东西。至于我在上面输入的 strace 的下部(先写后读)。看起来 write 是一个 sql select,而 read 是它的输出。在 strace 的完整输出中,您可以看到数百行读取,然后是数百行 brk(0xff2cc..)。此外,阅读的行看起来他们期望阅读的时间比他们得到的时间要多。例如。 read(18, "\1\0\0\1\0244\0\0\2\3def\4live\4File\4File\tCla"..., 16384) = 11488 看起来正在寻找 16384 字节并看到11488. 16k*500 读取 .8mb
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 2013-03-31
相关资源
最近更新 更多