Memory management cpu固定,内存固定,strace输出

Memory management cpu固定,内存固定,strace输出,memory-management,cpu,strace,Memory Management,Cpu,Strace,突然间,我一直在开发的一个应用程序正在冲击服务器的cpu和内存。自从这个“钉住”开始以来,我没有任何代码更改。我对strace做了一些挖掘,试图找出到底发生了什么,但我需要帮助破译输出的真正含义。我用一个pid运行了几分钟,cpu使用率为100%,占用了大约1.5GB的内存,然后用它运行了strace-c。我得到了以下输出。我在克隆和wait4命令中花了很长时间。有谁能告诉我如何使用这些信息 % time seconds usecs/call calls erro

突然间,我一直在开发的一个应用程序正在冲击服务器的cpu和内存。自从这个“钉住”开始以来,我没有任何代码更改。我对strace做了一些挖掘,试图找出到底发生了什么,但我需要帮助破译输出的真正含义。我用一个pid运行了几分钟,cpu使用率为100%,占用了大约1.5GB的内存,然后用它运行了strace-c。我得到了以下输出。我在克隆和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。下面是一个例外

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)

任何人都知道那里可能发生了什么。目录中的文件太多了吗?硬盘是否必须过多地搜索目录?

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

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


如果你问我的话,只需拿出一些叉子或穿线器。

我有更多关于这方面的信息。我的应用程序的用户上传图像。图像上传到的目录现在有80k以上已上传的图像文件。当我对一个占用cpu和内存的进程执行一系列操作时,我会在该目录中获得大量读取,然后是brk。下面是strace中的一个例外。好的,我找到了克隆和表单的东西。至于我上面输入的strace的下半部分(先写后读)。看起来写是一个sql选择,读是它的输出。在strace的完整输出中,您可以看到数百行读取,然后是数百行brk(0xff2cc..)。而且,阅读行看起来好像他们期望阅读的时间比他们得到的时间要多。例如read(18,“\1\0\0\1\0244\0\0\2\3def\4live\4File\4File\tCla”…,16384)=11488看起来我们在寻找16384字节,看到11488字节。16k*500读0.8mb