cpu挂钩,记忆挂钩,strace输出

时间:2012-12-17 22:11:50

标签: memory-management cpu strace

我一直在努力的一个应用程序是锤击服务器的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和内存的进程时,我会在该目录中获得大量读取,然后是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)

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

1 个答案:

答案 0 :(得分:0)

好吧,让我们从顶部开始吧。很多clone和wait4意味着这个应用程序会做更多的分叉或线程,然后应该这样做。

对于目录大小,如果要将图像文件读入动态分配的内存,则必须调用brk以获得更多内存。那很简单。

如果你问我,可以拿出一些叉子或穿线。