发布时间:2015-02-02 18:31:15作者:知识屋
dstat,vmstat、sar、iostat、netstat、free、ps、top等
buffer是用于存放(缓存)要输出到disk(块设备)的数据的,
cache是存放从disk上读出的数据。这buffer和cache是为了提高IO性能的,并由OS管理。
swap: linux内核读写虚拟内存是以 “页” 为单位操作的,把内存转移到硬盘交换空间(SWAP)和从交换空间读取到内存 的时候都是按页来读写的。
Paging:内存和SWAP的这种交换过程称为页面交换(Paging)
-/+ buffers/cache
used应用程序总共使用的内存数=Mem.used-Mem.buffers-Mem.cached
应用程序还未使用的内存数=Mem.free+Mem.buffers+Mem.cached
上面是free -m的运行结果,一共有4行。为了方便说明,笔者加上了列号。这样可以把free的输出看成一个二维数组rowcols(Free Output),下面可以使用2个等式表示两个等式
rowcols[3][2] = rowcols[2][2] - rowcols[2][5] - rowcols[2][6]
rowcols[3][3] = rowcols[2][3] + rowcols[2][5] + rowcols[2][6]
注:free命令中内存参数与top中第四行,五行--对应,top就是少了free第三行参数值
Recv-Q 网络接收队列 一般情况为0,如果持续为非0表示收到的数据已经在本地接收缓冲,应用程序还没处理,可能是应用程序处理性能下降。
Send-Q 发送队列 一般情况为0,如果持续为非0可能是应用向外发送数据包过快,或者是 对方接收数据包不够快。
netstat –an | grep 端口 (查看应用程序端口是否正常监听)
以前遇到过分布式缓存memcached在高峰访问中会出现这种现象,由于高峰时期极端情况下多线程lock内存池原因,导致服务端性能急剧下降。
vmstat CPU使用率,内存使用,虚拟内存交换情况,IO读写情况
一般使用格式为:vmstat interval count //表示输出频率1秒,连续输出10次
使用实例: vmstat 1 10
如果CPU的sy和us值相加的百分比接近100%,或者运行队列(r)中等待 的进程数总是不等于0,且经常大于4,同时id也经常小于40,则该系 统受限于CPU;如果bi、bo的值总是不等于0,则该系统受限于内存。 swpd值过高一般情况由于物理内存不够用.
free列表示当前空闲的物理内存数量(以k为单位)si列表示由磁盘调入内存,也就是内存进入内存交换区的数量。so列表示由内存调入磁盘,也就是内存交换区进入内存的数量。 一般情况下,si、so的值都为0,如果si、so的值长期不为0,则表示系统内存不足。需要增加系统内存。in 每秒CPU的中断次数
格式如下:sar -d interval count
上面每项的输出解释如下:
平均百分比为 = 总cpu占百分比/cpu核心数
%user 表示平均处理用户进程所使用 CPU 的百分比。格式如下:mpstat -P ALL interval count
它显示了系统中CPU的各种统计信息。–P ALL 选项指示该命令显示所有 CPU 的统计信息.
%user 表示处理用户进程所使用 CPU 的百分比。格式:dstat -tcdnmlpygs interval count
dstat具体参数说明就不列出了,上述其他命令已经有说明
在获取的信息上有点类似于top、free、iostat、vmstat等多个工具的合集.
CPU状态:CPU的使用率iftop显示了系统上所有源主机或者目的主机网络带宽使用的列表,此列表定期更新。
输出当前目录下各个子目录所使用的空间:du -h --max-depth=1
按照子目录大小排序(降序):du -s * | sort -rn | cut -f2- | xargs -d "/n" du -sh
当某台或几台机器作为基础服务组件或中间件节点(不一定为java,或python,go,c/c++等等)集群部署时,会有大量客户端会依赖此服务而连接此目标集群。笔者遇到真实情况,集群正常运行好长一段时间后,有一天突然发现集群中某个节点处于不可用状态。观察其应用程序日志没有任何错误信息,而且服务程序却无法正常对外提供响应。
笔者通过相关命令按照以上几个法则(cpu,内存,磁盘io,网络io,网络流量),当我们查看cpu,io,网络流量,磁盘容量,
发现监听端口连接数数量巨大,存在问题,经定位分析发现某台客户端主机创建大量网络连接没有释放。一般情况下linux系统最大文件描述数量设置都非常大,到达100W以上,多数是其他资源先消耗。
下面是模拟当时环境的一幅图。
[lizhitao@host ] netstat -an | grep 9094
[lizhitao@host ] lsof -i:9094 | awk '{print $9}' | cut -d ">" -f2 | awk '{ cidx=index($1,":");print substr($1,0,cidx-1)}' | sort | uniq -c | sort -rn
很明显mafka.sankuai.com这台主机创建了大量连接,导致资源耗尽。
说明:netstat一般显示是ip,lsof一般显示主机名,因为客户端连接比较多(在TCP里好像每个socket占用500byte),很难一下子看出哪个客户主机数比较多,所以2命令组合使用就比较方便。
扩展阅读:
上面案例是网络连接(网络文件描述符)问题,而有些可能是磁盘文件(描述符)打开量巨大,而没有释放资源导致程序bug。
典型就是存储图片或小文件的分布式文件系统。
递归查找某个目录中所有打开的文件java进程cpu的消耗排序
[lizhitao@host ] ps p 31476 -L -o pcpu,pid,tid,time,tname,stat,psr | gawk '{printf("%s %d %d %s %s %s %x/n",$1,$2,$3,$4,$5,$6,$3) }' | sort -n -k1 -r
假如上述图片列表中显示的cpu消耗很高且大约80%cpu,则我们可以通过上述命令操作,找到对应线程号nid=31510转换为十六进制0x7b16
[lizhitao@host ] jstack 31476 | grep "7b16"
[lizhitao@host ] jstack 31476
缩小代码排查范围,顺藤摸瓜找到对应的调用堆栈信息和代码,然后对相关代码逻辑进行分析。
如果遇到上述错误,可以先检测一下硬盘状态信息(一般是这类问题概率不大,除非是数据库或做存储用的服务器)
请参考硬盘检测smartctl:Linux系统下检测硬盘的健康状态
Linux硬盘的检测
如果磁盘状态一切正常,则分析可能为挂载磁盘空间占满。
执行 :df -h 查看磁盘空间占用情况
然后到相应的应用程序软件部署目录或数据存储目录下执行:
du -s * | sort -rn | cut -f2- | xargs -d "/n" du -sh
就可以顺利找到占用空间比较大的目录,然后做相应处理。
以上,就是我在linux下后端诊断与调试时遇到的问题和收获,以及解决办法,下面是我对这些方面的总结:
linux下后端诊断与调试是复杂而比较有挑战性工作,需要操作者或工程师综合运用各种手段找到问题所在,从而逐步地缩小范围,定位到某个点上,不同的应用程序也会不一样,比如说:普通的java(tomcat)服务与memcached分布式缓存遇到问题也不尽相同。首先我们可以从系统层面上划清界限,是操作系统,本机服务程序,还是其他主机访问导致的。通过六种手段,比如说网络io,磁盘io,内存,cpu,打开文件,线程等,分析其瓶颈方向。所以没有一种命令或方法能“包治百病”,需要工程师在不同应用环境下,巧妙选择且综合运用不同手段,搭配多种命令组合才能完成。
linux一键安装web环境全攻略 在linux系统中怎么一键安装web环境方法
Linux网络基本网络配置方法介绍 如何配置Linux系统的网络方法
Linux下DNS服务器搭建详解 Linux下搭建DNS服务器和配置文件
对Linux进行详细的性能监控的方法 Linux 系统性能监控命令详解
linux系统root密码忘了怎么办 linux忘记root密码后找回密码的方法
Linux基本命令有哪些 Linux系统常用操作命令有哪些
Linux必学的网络操作命令 linux网络操作相关命令汇总
linux系统从入侵到提权的详细过程 linux入侵提权服务器方法技巧
linux系统怎么用命令切换用户登录 Linux切换用户的命令是什么
在linux中添加普通新用户登录 如何在Linux中添加一个新的用户
2012-07-10
CentOS 6.3安装(详细图解教程)
Linux怎么查看网卡驱动?Linux下查看网卡的驱动程序
centos修改主机名命令
Ubuntu或UbuntuKyKin14.04Unity桌面风格与Gnome桌面风格的切换
FEDORA 17中设置TIGERVNC远程访问
StartOS 5.0相关介绍,新型的Linux系统!
解决vSphere Client登录linux版vCenter失败
LINUX最新提权 Exploits Linux Kernel <= 2.6.37
nginx在网站中的7层转发功能