查看进程所消耗的内存的shell脚本

#!/bin/sh mem=`free -m | awk 'NR==2{print $2}'` ps -aux 2>&1 | sort -k 4 -r | awk '$4 ~ /^[0-9]/ && $4>0 {print $4,$11}' | awk '{print $1/100*mem"   "$2}' mem=$mem | sort -k 2 | awk ' { a[$2] += $1; b[$2]++; total += $1; total++; } END{ for(i in a){ t=i; gsub(/:|.*\//, "", t); printf "%10s   %s\n" ,a[i]"MB", t"["b[i]"]"; } print "Memory Total: "mem"MB, used: "total"MB, free: "mem-total"MB." }' mem=$mem | sort -n -r 代码如下:
[root@Test230 zy]# sh mem.sh 3024.17MB   java[17] 78.96MB   java[1] 3.948MB   python[1] 3.948MB   ntpd[1] 3.948MB   iscsid[1] 3.948MB   gdmgreeter[1] Memory Total: 3948MB, used: 3140.92MB, free: 807.08MB.

linux下查看最消耗CPU、内存的进程

linux下查看最消耗CPU、内存的进程
1.CPU占用最多的前10个进程:
ps auxw|head -1;ps auxw|sort -rn -k3|head -10
2.内存消耗最多的前10个进程
ps auxw|head -1;ps auxw|sort -rn -k4|head -10
3.虚拟内存使用最多的前10个进程
ps auxw|head -1;ps auxw|sort -rn -k5|head -10
4.也可以试试
www.2cto.com
ps auxw --sort=rss
ps auxw --sort=%cpu
5.看看几个参数含义
%MEM 进程的内存占用率
MAJFL is the major page fault count,
VSZ 进程所使用的虚存的大小
RSS 进程使用的驻留集大小或者是实际内存的大小(RSS is the "resident set size" meaning physical memory used)
TTY 与进程关联的终端(tty)
串行端口终端(/dev/ttySn)
伪终端(/dev/pty/)
控制终端(/dev/tty)
控制台终端(/dev/ttyn,   /dev/console)
虚拟终端(/dev/pts/n)
STAT 检查的状态:进程状态使用字符表示的,如R(running正在运行或准备运行)、S(sleeping睡眠)、I(idle空闲)、Z (僵死)、D(不可中断的睡眠,通常是I/O)、P(等待交换页)、W(换出,表示当前页面不在内存)、N(低优先级任务)T(terminate终止)、W has no resident pages
  www.2cto.com
D不可中断 Uninterruptible sleep (usually IO)
R正在运行,或在队列中的进程
S处于休眠状态
T停止或被追踪
Z僵尸进程
W进入内存交换(从内核2.6开始无效)
X死掉的进程
<高优先级
N低优先级
L有些页被锁进内存
s包含子进程
+位于后台的进程组;
l多线程,克隆线程  multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
  www.2cto.com
google后整理

简单解读linux的/proc下的statm、maps、memmap 内存信息文件分析

简单解读linux的/proc下的statm、maps、memmap 内存信息文件分析 几乎看什么内核漏洞分析之类的文章,第一眼都是被 cat /proc/{pid}/maps 产生的一堆奇怪的信息唬住了,都不敢往下看 居然没有搜到关于它们的详细介绍,旁边也没有表头什么的解释信息 那就我来整理一下吧,方便后人 ls /proc 能看到一些数字命名的文件夹,这个就不多说了,什么pid、fd的知识还是容易弄到的 拿init开刀, [root@localhost proc]# cat /proc/1/statm 487 185 133 31 0 67 0 很简单地返回7组数字,每一个的单位都是一页 (常见的是4KB) 分别是 size:任务虚拟地址空间大小 Resident:正在使用的物理内存大小 Shared:共享页数 Trs:程序所拥有的可执行虚拟内存大小 Lrs:被映像倒任务的虚拟内存空间的库的大小 Drs:程序数据段和用户态的栈的大小 dt:脏页数量 接下来看看maps [root@localhost proc]# cat /proc/1/maps 00110000-00111000 r-xp 00110000 00:00 0 [vdso] 0032b000-00347000 r-xp 00000000 fd:00 852733 /lib/ld-2.8.so 00347000-00348000 r--p 0001c000 fd:00 852733 /lib/ld-2.8.so 00348000-00349000 rw-p 0001d000 fd:00 852733 /lib/ld-2.8.so 0034b000-004ae000 r-xp 00000000 fd:00 852734 /lib/libc-2.8.so 004ae000-004b0000 r--p 00163000 fd:00 852734 /lib/libc-2.8.so 004b0000-004b1000 rw-p 00165000 fd:00 852734 /lib/libc-2.8.so 004b1000-004b4000 rw-p 004b1000 00:00 0 08048000-08067000 r-xp 00000000 fd:00 843075 /sbin/init 08067000-08068000 rw-p 0001e000 fd:00 843075 /sbin/init 08b42000-08b6a000 rw-p 08b42000 00:00 0 [heap] b8046000-b8048000 rw-p b8046000 00:00 0 bfb4e000-bfb63000 rw-p bffeb000 00:00 0 [stack] 一共有6列 第一列代表内存段的虚拟地址 第二列代表执行权限,r,w,x不必说,p=私有 s=共享 不用说,heap和stack段不应该有x,否则就容易被xx,不过这个跟具体的版本有关 第三列代表在进程地址里的偏移量 第四列映射文件的主设备号和次设备号 通过 cat /proc/devices 得知fd是253 device-mapper 第五列映像文件的节点号,即inode 第六列是映像文件的路径 以前我很奇怪怎么会有两个相同的文件路径,原来 08048000-08067000 r-xp 00000000 fd:00 843075 /sbin/init 08067000-08068000 rw-p 0001e000 fd:00 843075 /sbin/init 一个是只读的,是代码段,一个是读写的,是数据段 至于为什么共享库分成了三个 0034b000-004ae000 r-xp 00000000 fd:00 852734 /lib/libc-2.8.so 004ae000-004b0000 r--p 00163000 fd:00 852734 /lib/libc-2.8.so 004b0000-004b1000 rw-p 00165000 fd:00 852734 /lib/libc-2.8.so 其中的004ae000-004b0000 r--p 00163000 fd:00 852734 /lib/libc-2.8.so 还是不能理解 最后看看神秘的memmap 可惜不是所有的版本都有这个文件,如同我这里的情况 只有口头说一说了,memmap需要和maps配合看 显示出来的每一行代表maps里的一个段 每一行的每一个数字,代表那个段里的一个页,段有多大,一行就有对应的多少个数字 如果这个数字是0,代表系统为其分配了虚拟内存,但是没有分配物理内存 如果有数字,则代表系统为其分配了物理内存,以及有多少个进程引用了这个页 当然,不会有负数出现 原文地址