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