zoukankan      html  css  js  c++  java
  • Linux下找出吃内存的方法总结

    Linux下查询进程占用的内存方法总结,假设现在有一个「php-cgi」的进程 ,进程id为「25282」。
    现在想要查询该进程占用的内存大小。linux命令行下有很多的工具进行查看,现总结常见的几种方式。

    查看某一进程使用的内存

    通过进程的 status

    [root@web3_u ~]# cat /proc/25282/status
    Name: php-cgi
    State: S (sleeping)
    Tgid: 25282
    Pid: 25282
    PPid: 27187
    TracerPid: 0
    Uid: 99 99 99 99
    Gid: 99 99 99 99
    Utrace: 0
    FDSize: 256
    Groups: 99
    VmPeak: 496388 kB
    VmSize: 438284 kB
    VmLck: 0 kB
    VmHWM: 125468 kB
    VmRSS: 113612 kB
    VmData: 92588 kB
    VmStk: 100 kB
    VmExe: 6736 kB
    VmLib: 18760 kB
    VmPTE: 528 kB
    VmSwap: 0 kB
    Threads: 1
    SigQ: 0/46155
    SigPnd: 0000000000000000
    ShdPnd: 0000000000000000
    SigBlk: 0000000000000000
    SigIgn: 0000000000001000
    SigCgt: 0000000184000004
    CapInh: 0000000000000000
    CapPrm: 0000000000000000
    CapEff: 0000000000000000
    CapBnd: ffffffffffffffff
    Cpus_allowed: f
    Cpus_allowed_list: 0-3
    Mems_allowed: 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
    Mems_allowed_list: 0
    voluntary_ctxt_switches: 68245
    nonvoluntary_ctxt_switches: 15751
    #VmRSS: 113612 kB 表示占用的物理内存
    

    通过 pmap

    [root@web3_u ~]# pmap -x 25282
    25282: /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf
    Address Kbytes RSS Dirty Mode Mapping
    0000000000400000 6736 2692 0 r-x-- php-cgi
    0000000000c93000 264 196 120 rw--- php-cgi
    0000000000cd5000 60 48 48 rw--- [ anon ]
    . . .
    00007fd6226bc000 4 4 4 rw--- ld-2.12.so
    00007fd6226bd000 4 4 4 rw--- [ anon ]
    00007fff84b02000 96 96 96 rw--- [ stack ]
    00007fff84bff000 4 4 0 r-x-- [ anon ]
    ffffffffff600000 4 0 0 r-x-- [ anon ]
    ---------------- ------ ------ ------
    total kB 438284 113612 107960
    #标题行
    1、进程ID
    2、启动命令「/usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf」
    3、RSS :占用的物理内存 113612KB
    #最后一行
    mapped 表示该进程映射的虚拟地址空间大小,也就是该进程预先分配的虚拟内存大小,即ps出的vsz
    writeable/private  表示进程所占用的私有地址空间大小,也就是该进程实际使用的内存大小     
    shared 表示进程和其他进程共享的内存大小
    

    通过 smaps

    [root@web3_u ~]# cat /proc/25282/smaps | grep '^Rss:' 
    | awk '{sum +=$2} END{print sum}'
    113612
    

    求和得到实际占用物理内存为 113612

    通过 ps 命令

    [root@web3_u ~]# ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' 
    | awk '$1 ~ /25282/'
    25282 php-cgi /usr/local/php/bin/php-cgi 0.0 113612 438284 Oct09 nobody 99
    

    awk 过滤 25282 进程号,得到第5列「rsz」的内存大小为「113612」

    输出php-cgi进程占用的物理内存,并从高到低进行排序

    [root@web3_u ~]# ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' 
    | grep php-cgi | sort -k5nr
    
    23946 php-cgi /usr/local/php/bin/php-cgi 0.0 129540 440000 Oct06 nobody 99
    24418 php-cgi /usr/local/php/bin/php-cgi 0.0 129336 437684 Oct06 nobody 99
    18973 php-cgi /usr/local/php/bin/php-cgi 0.0 129268 440176 Oct06 nobody 99
    17219 php-cgi /usr/local/php/bin/php-cgi 0.0 126588 439840 Oct06 nobody 99
    6996 php-cgi /usr/local/php/bin/php-cgi 0.0 124876 438104 Oct09 nobody 99
    23850 php-cgi /usr/local/php/bin/php-cgi 0.0 122984 440036 Oct09 nobody 99
    28310 php-cgi /usr/local/php/bin/php-cgi 0.0 122920 436456 Oct09 nobody 99
    

    其中rsz为实际内存,上例实现按内存排序,由大到小

    TOP 命令输出的列

    top - 15:45:07 up  1:26,  2 users,  load average: 6.15, 5.11, 5.83
    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    ...
    25282 nobody 20 0 428m 110m 93m S 0.0 1.9 0:34.42 php-cgi
    

    系统负载
    参考网站
    CPU核心数参考

    在评估CPU负载时,我们只以5分钟为单位为统计任务队列长度。如果每隔5分钟统计的时候,发现任务队列长度都是1,那么CPU负载就为1。假如我们只有一个单核的CPU,负载一直为1,意味着没有任务在排队,还不错。
    如果是双核又CPU,等于是有4个内核,每个内核的负载为1的话,总负载为4。这就是说,如果我那台服务器的CPU负载长期保持在4左右,还可以接受。
    但是每个内核的负载为1,并不能算是一种理想状态!这意味着我们的CPU一直很忙,不得清闲。理想的状态是每个内核的负载为0.7左右,0.7乘以内核数,得出服务器理想的CPU负载
    
    #输出行信息
    PID 25282
    用户 nobody
    虚拟内存 428M
    物理内存 110M 110*1024= 112640 「和前面计算出来的值基本一致」
    共享内存 93M
    进程使用的物理内存和总内存的百分比 1.9 %
    
    PID:进程的ID
    USER:进程所有者
    PR:进程的优先级别,越小越优先被执行
    NInice:值
    VIRT:进程占用的虚拟内存
    RES:进程占用的物理内存
    SHR:进程使用的共享内存
    S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
    %CPU:进程占用CPU的使用率
    %MEM:进程使用的物理内存和总内存的百分比
    TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。
    COMMAND:进程启动命令名称
    

    按P

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    16036 root 20 0 8902m 8.6g 480 R 100.0 36.6 0:33.15 redis-server
    12934 root 20 0 8902m 8.6g 1072 S 5.5 36.6 285:37.81 redis-server
    969 root 20 0 0 0 0 D 4.2 0.0 277:14.85 flush-252:16
    1304 root 23 3 1689m 50m 3264 S 4.2 0.2 1445:03 xs-searchd
    1294 root 20 0 14928 928 584 S 3.5 0.0 635:05.31 xs-indexd
    1287 nobody 20 0 12884 772 576 S 2.8 0.0 833:11.42 dnsmasq
    1302 root 23 3 1113m 39m 3244 S 0.7 0.2 1437:57 xs-searchd
    4444 www 20 0 280m 43m 884 S 0.7 0.2 27:43.92 nginx
    1 root 20 0 19232 1160 868 S 0.0 0.0 0:06.75 init
    

    按 P .表示按cpu排序,默认也是按cpu排序

    按M

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    12934 root 20 0 8902m 8.6g 1072 S 6.0 36.6 285:39.77 redis-server
    16036 root 20 0 8902m 8.6g 480 R 100.0 36.6 1:11.42 redis-server
    1236 www 20 0 1053m 209m 6556 S 0.0 0.9 4:40.70 php-cgi
    1231 www 20 0 1034m 146m 6536 S 0.0 0.6 4:20.82 php-cgi
    1184 www 20 0 1043m 119m 6584 S 0.0 0.5 4:21.85 php-cgi
    

    按M 。 表示按占用内存排序。 第一列 redis服务器占用了8.6G的内存 。 这个内存和redis info基本相同。

    [root@img1_u ~]# redis-cli info memory
    # Memory
    used_memory_human:8.32G
    
    [root@img1_u ~]# top -u www
    top - 22:09:01 up 67 days, 14:16, 1 user, load average: 0.61, 0.90, 0.98
    Tasks: 283 total, 2 running, 281 sleeping, 0 stopped, 0 zombie
    Cpu(s): 3.9%us, 1.0%sy, 0.5%ni, 89.7%id, 4.6%wa, 0.0%hi, 0.3%si, 0.0%st
    Mem: 24542176k total, 21130060k used, 3412116k free, 1750652k buffers
    Swap: 524280k total, 0k used, 524280k free, 4039732k cached
    
    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    681 www 20 0 855m 25m 5796 S 0.0 0.1 0:47.00 php-cgi
    1181 www 20 0 887m 57m 6484 S 0.0 0.2 4:41.66 php-cgi
    1183 www 20 0 864m 34m 6320 S 0.0 0.1 3:52.39 php-cgi
    1184 www 20 0 1043m 119m 6584 S 0.0 0.5 4:21.85 php-cgi
    1185 www 20 0 869m 39m 6376 S 0.0 0.2 3:57.84 php-cgi
    1186 www 20 0 886m 56m 6244 S 0.0 0.2 3:44.75 php-cgi
    1187 www 20 0 926m 66m 6480 S 0.0 0.3 4:16.12 php-cgi
    1188 www 20 0 890m 60m 6288 S 0.0 0.3 4:13.35 php-cgi
    1189 www 20 0 892m 62m 6408 S 0.0 0.3 4:06.60 php-cgi
    

    -u 指定用户。 php-cgi占用的内存在60M左右

    按进程消耗内存多少排序的方法

    通过 ps 命令

    第一种方法

    ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | sort -k5nr
    

    第二种方法

    ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' --sort -rsz
    
    [root@web3_u ~]# ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user' | sort -k5nr
    23946 php-cgi /usr/local/php/bin/php-cgi 0.0 129540 440000 Oct06 nobody
    24418 php-cgi /usr/local/php/bin/php-cgi 0.0 129336 437684 Oct06 nobody
    18973 php-cgi /usr/local/php/bin/php-cgi 0.0 129268 440176 Oct06 nobody
    17219 php-cgi /usr/local/php/bin/php-cgi 0.0 126588 439840 Oct06 nobody
    6996 php-cgi /usr/local/php/bin/php-cgi 0.0 125056 438104 Oct09 nobody
    23850 php-cgi /usr/local/php/bin/php-cgi 0.0 122984 440036 Oct09 nobody
    
    #参数解析:
    -e 显示所有进程
    -o 定制显示信息
    pid 进程ID
    comm 进程名
    args 启动命令
    pcpu 占用CPU 百分比
    rsz 占用物理内存大小
    vsz 占用虚拟内存大小
    stime 进程启动时间
    user 启动用户
    
    #以第一行为例
    进程ID 23946
    进程名 php-cgi
    启动命令 /usr/local/php/bin/php-cgi
    占用CPU 0
    占用物理内存 129540
    占用虚拟内存 440000
    启动时间 Oct06
    启动用户 nobody
    

    通过 top 命令

    top命令默认是以CPU排序输出的,按字母「M」,可以按内存占用大小进行排序显示

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    23946 nobody 20 0 429m 126m 107m S 0.0 2.2 1:15.01 php-cgi
    24418 nobody 20 0 427m 126m 109m S 0.0 2.2 1:19.56 php-cgi
    18973 nobody 20 0 429m 126m 107m S 0.0 2.2 1:20.18 php-cgi
    17219 nobody 20 0 429m 123m 104m S 0.0 2.1 1:23.60 php-cgi
    6996 nobody 20 0 427m 122m 105m S 0.0 2.1 1:05.27 php-cgi
    23850 nobody 20 0 429m 120m 101m S 0.0 2.1 1:02.43 php-cgi
    
    #输出参数介绍
    PID:进程的ID
    USER:进程所有者
    VIRT:进程占用的虚拟内存
    RES:进程占用的物理内存
    SHR:进程使用的共享内存
    S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
    %CPU:进程占用CPU的使用率
    %MEM:进程使用的物理内存和总内存的百分比
    TIME+:该进程启动后占用的总的CPU时间,即占用CPU使用时间的累加值。
    
    #通过比较进程ID 「23946」,top 命令和 ps 命令输出的结果基本保持一致。
    
  • 相关阅读:
    约瑟夫环-我的解答与迷宫
    数据结构实验一
    typedef struct 是什么意思
    编程名言名句
    创建单链表
    离散实验一
    Angela Merkel poised for record poll win and historic third term
    我的生活计划-贵在执行,贵在坚持
    考研经验
    2010年河南省普通高校招生本科一批院校 平行投档分数线(理科)
  • 原文地址:https://www.cnblogs.com/syy1757528181/p/14498130.html
Copyright © 2011-2022 走看看