找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 995|回复: 0

[linux服务器] linux查看哪些进程用了swap

[复制链接]

252

主题

7

回帖

2562

积分

Administrator

我是大家的小可爱

积分
2562

最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

发表于 2021-4-22 12:18:42 | 显示全部楼层 |阅读模式
如果系统的物理内存用光了,则会用到swap。系统就会跑得很慢,但仍能运行;如果Swap空间用光了,那么系统就会发生错误。通常会出现“application is out of memory”的错误,严重时会造成服务进程的死锁。所以要高度重视。


swap查看有很多种方法,一一介绍下:
free
  1. <div><font size="3">free -m</font></div><div></div>
复制代码


就能看出当前系统所使用的swap了。那么如何查看哪些进程使用了swap呢,这样好针对性的做出优化。


top

Centos(6.0之前):

top只能看到swap总使用量

网上很多人说top+f+p能显示出来swap。可是按完f查看的时候,man top里面swap的解释是:



并不是实际的使用swap。而是VIRT-RES得来的。用我蹩脚的英文翻译就是,虚拟内存中所使用过的swap部分


Centos(6.0之后):


  1. man top
复制代码

这样就明显看出是取出的每个进程的swap,能很方便的查看哪些进程使用了swap。从中也能看到一个信息。那就是读取了/proc/#/status


vmstat
  1. vmstat -n 1
复制代码

也能查看到

仍旧无法查看到哪些进程使用了。但是能看到si、so

Memory(内存):

swpd: 使用虚拟内存大小

free: 可用内存大小

buff: 用作缓冲的内存大小

cache: 用作缓存的内存大小

Swap:

si: 每秒从交换区写到内存的大小

so: 每秒写入交换区的内存大小

shell
在Linux内核 2.6.16中引入了一个系统内存接口特性,这个接口位于/proc/$pid/目录下的smaps文件中  ,一看内容发现是进程内存映像信息,比同一目录下的maps文件更详细些。
  1. cat /proc/1/smaps
复制代码
这里解释下samps里面的内容:
bfdca000-bfddf000 是该虚拟内存段的开始和结束位置
rw-p 内存段的权限,rw是指可读写,p是指私有,如果是s则为共享
bffea000 该虚拟内存段在对应的映射文件中的偏移量
00:00 文件的主设备和次设备号
0 被映射到虚拟内存的文件的索引节点号
[stack] 被映射到虚拟内存的文件名称
Size 是进程使用内存空间,并不一定实际分配了内存(VSS)
Rss是实际分配的内存(不需要缺页中断就可以使用的)
Shared_Clean 和其他进程共享的未改写页面
Shared_Dirty 和其他进程共享的已改写页面
Private_Clean 未改写的私有页面页面
Private_Dirty 已改写的私有页面页面
Swap 存在于交换分区的数据大小(如果物理内存有限,可能存在一部分在主存一部分在交换分区)
Pss是平摊计算后的使用内存(有些内存会和其他进程共享,例如mmap进来的)
这里能显示出swap
那么查看你想要看的进程所使用的swap只需要:

  1. awk '/^Swap:/ {SWAP+=$2}END{print SWAP" KB"}' /proc/$(pid)/smaps
复制代码
也可以写shell统计所以进程的:

  1. #!/bin/bash
  2. # Get current swap usage for all running processes
  3. # writted by xly

  4. function getswap {
  5. SUM=0
  6. OVERALL=0
  7. for DIR in `find /proc/ -maxdepth 1 -type d | egrep "^/proc/[0-9]"` ; do
  8. PID=`echo $DIR | cut -d / -f 3`
  9. PROGNAME=`ps -p $PID -o comm --no-headers`
  10. for SWAP in `grep Swap $DIR/smaps 2>/dev/null| awk '{ print $2 }'`
  11. do
  12. let SUM=$SUM+$SWAP
  13. done
  14. echo "PID=$PID - Swap used: $SUM - ($PROGNAME )"
  15. let OVERALL=$OVERALL+$SUM
  16. SUM=0

  17. done
  18. echo "Overall swap used: $OVERALL"
  19. }

  20. getswap
  21. #getswap|egrep -v "Swap used: 0"
复制代码
既然知道了原理,大家各自发挥,什么语言都可以统计



玖毅网官网www.jiuy.cc 玖毅云服务器www.jyyidc.com
玖毅资源站www.91xzz.cn 玖毅修电脑www.91xdn.cn
玖毅网论坛www.webbbs.cn 玖毅系统站www.91system.cn
可可网络验证www.kekeyz.cn 玖毅建站系统www.91web.top
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表