相干 阅读:
三年无bug,提拔 代码质量的法门
一个基于 Linux 操纵 体系 的服务器运行的同时 ,也会表征出各种各样参数信息。通常来说运维职员 、体系 管理员会对这些数据会极为敏感,但是这些参数对于开辟 者来说也非常 紧张 ,尤其当你的程序非正常工作的时间 ,这些蛛丝马迹每每 会资助 快速定位跟踪题目 。
这里只是一些简单 的工具查察 体系 的相干 参数,固然 很多 工具也是通太过 析加工 /proc、/sys 下的数据来工作的,而那些更加过细 、专业的性能监测和调优 ,大概 还必要 更加专业的工具(perf 、systemtap 等)和技能 才华 完成哦。毕竟 来说,体系 性能监控本身 就是个大学问。
一、CPU和内存类
1.1
top
? ~ top
第一行背面 的三个值是体系 在之前 1、5 、15 的均匀 负载,也可以看出体系 负载是上升、安稳 、降落 的趋势 ,当这个值高出 CPU 可实行 单位 的数量 ,则表现 CPU 的性能已经饱和成为瓶颈了 。
第二行统计了体系 的任务 状态信息。running 很天然 不必多说,包罗 正在 CPU 上运行的和将要被调治 运行的;sleeping 通常是等待 变乱 (比如 IO 操纵 )完成的任务 ,细分可以包罗 interruptible 和 uninterruptible 的范例 ;stopped 是一些被停息 的任务 ,通常发送 SIGSTOP 大概 对一个前台任务 操纵 Ctrl-Z 可以将其停息 ;zombie 僵尸任务 ,固然 进程 停止 资源会被主动 采取 ,但是含有退出任务 的 task deor 必要 父进程 访问后才华 开释 ,这种进程 表现 为 defunct 状态,无论是由于 父进程 提前退出还是 未 wait 调用,出现这种进程 都应该格外留意 程序是否计划 有误。
第三行 CPU 占用率根据范例 有以下几种环境 :
(us) user:CPU 在低 nice 值(高优先级)用户态所占用的时间(nice=0) 。正常环境 下只要服务器不是很闲 ,那么大部分 的 CPU 时间应该都在此实行 这类程序
(sy) system:CPU 处于内核态所占用的时间,操纵 体系 通过体系 调用(system call)从用户态陷入内核态,以实行 特定的服务;通常环境 下该值会比力 小 ,但是当服务器实行 的 IO 比力 麋集 的时间 ,该值会比力 大
(ni) nice:CPU 在高 nice 值(低优先级)用户态以低优先级运行占用的时间(nice0)。默认新启动的进程 nice=0,是不管帐 入这里的 ,除非手动通过 renice 大概 setpriority() 的方式修改程序的nice值
(id) idle:CPU 在空闲状态(实行 kernel idle handler )所占用的时间
(wa) iowait:等待 IO 完成做占用的时间
(hi) irq:体系 处理 惩罚 硬件停止 所斲丧 的时间
(si) softirq:体系 处理 惩罚 软停止 所斲丧 的时间,记取 软停止 分为 softirqs 、tasklets (着实 是前者的特例)、work queues,不知道这里是统计的是哪些的时间,毕竟 work queues 的实行 已经不是停止 上下文了
(st) steal:在假造 机环境 下才故意 义 ,由于 假造 机下 CPU 也是共享物理 CPU 的,以是 这段时间表明假造 机等待 hypervisor 调治 CPU 的时间,也意味着这段时间 hypervisor 将 CPU 调治 给别的 CPU 实行 ,这个时段的 CPU 资源被“stolen ”了。这个值在我 KVM 的 VPS 呆板 上是不为 0 的,但也只有 0.1 这个数量 级,是不是可以用来判定 VPS 超售的环境 ?
CPU 占用率高很多 环境 下意味着一些东西 ,这也给服务器 CPU 利用 率过高环境 下指明白 相应地排查思绪 :
当 user 占用率过高的时间 ,通常是某些个别的进程 占用了大量的 CPU,这时间 很轻易 通过 top 找到该程序;此时假如 猜疑 程序非常 ,可以通过 perf 等思绪 找出热门 调用函数来进一步排查;
当 system 占用率过高的时间 ,假如 IO 操纵 (包罗 终端 IO)比力 多,大概 会造成这部分 的 CPU 占用率高 ,比如 在 file server、database server 等范例 的服务器上,否则(比如 20%)很大概 有些部分 的内核、驱动模块有题目 ;
当 nice 占用率过高的时间 ,通常是故意 举动 ,当进程 的发起者知道某些进程 占用较高的 CPU ,会设置其 nice 值确保不会沉没 其他进程 对 CPU 的利用 哀求 ;
当 iowait 占用率过高的时间 ,通常意味着某些程序的 IO 操纵 服从 很低,大概 IO 对应装备 的性能很低以至于读写操纵 必要 很长的时间来完成;
当 irq/softirq 占用率过高的时间 ,很大概 某些外设出现题目 ,导致产生大量的irq哀求 ,这时间 通过查抄 /proc/interrupts 文件来穷究 题目 地点 ;
当 steal 占用率过高的时间 ,黑心厂商假造 机超售了吧!
第四行和第五行是物理内存和假造 内存(互换 分区)的信息:
total = free + used + buff/cache,如今 buffers和cached Mem信息总和到一起了,但是buffers和cached
Mem 的关系很多 地方都没说清楚 。着实 通过对比数据 ,这两个值就是 /proc/meminfo 中的 Buffers 和 Cached 字段:Buffers 是针对 raw disk 的块缓存,重要 是以 raw block 的方式缓存文件体系 的元数据(比如 超等 块信息等),这个值一样平常 比力 小(20M左右);而 Cached 是针对于某些具体 的文件举行 读缓存 ,以增长 文件的访问服从 而利用 的,可以说是用于文件体系 中文件缓存利用 。
而 avail Mem 是一个新的参数值,用于指示在不举行 互换 的环境 下,可以给新开启的程序多少内存空间 ,大抵 和 free + buff/cached 相称 ,而这也印证了上面的说法,free + buffers + cached Mem才是真正可用的物理内存。而且 ,利用 互换 分区不见得是坏事变 ,以是 互换 分区利用 率不是什么严峻 的参数,但是频仍 的 swap in/out 就不是功德 情了 ,这种环境 必要 留意 ,通常表现 物理内存紧缺的环境 。
末了 是每个程序的资源占用列表,此中 CPU 的利用 率是全部 CPU core 占用率的总和 。通常实行 top 的时间 ,本身 该程序会大量的读取 /proc 操纵 ,以是 根本 该 top 程序本身 也会是压倒统统 的。
top 固然 非常强大 ,但是通常用于控制台及时 监测体系 信息 ,不得当 长时间(几天 、几个月)监测体系 的负载信息,同时对于短命的进程 也会遗漏无法给出统计信息。
1.2
vmstat
vmstat 是除 top 之外另一个常用的体系 检测工具,下面截图是我用-j4编译boost的体系 负载 。
r 表现 可运行进程 数量 ,数据大抵 符合 ;而b表现 的是 uninterruptible 就寝 的进程 数量 ;swpd 表现 利用 到的假造 内存数量 ,跟 top-Swap-used 的数值是一个寄义 ,而如手册所说,通常环境 下 buffers 数量 要比 cached Mem 小的多 ,buffers 一样平常 20M这么个数量 级;io 域的 bi、bo 表明每秒钟向磁盘吸取 和发送的块数量 (blocks/s);system 域的 in 表明每秒钟的体系 停止 数(包罗 时钟停止 ),cs表明由于 进程 切换导致上下文切换的数量 。
说到这里,想到从前 很多 人纠结编译 linux kernel 的时间 -j 参数毕竟 是 CPU Core 还是 CPU Core+1?通过上面修改 -j 参数值编译 boost 和 linux kernel 的同时开启 vmstat 监控 ,发现两种环境 下 context switch 根本 没有变革 ,且也只有明显 增长 -j 值后 context switch 才会有明显 的增长 ,看来不必过于纠结这个参数了 ,固然 具体 编译时间长度我还没有测试。资料说假如 不是在体系 启动大概 benchmark 的状态,参数 context switch100000 程序肯定有题目 。
1.3
pidstat
假如 想对某个进程 举行 全面具体 的追踪,没有什么比 pidstat 更符合 的了——栈空间、缺页环境 、主被动切换等信息一清二楚 。这个下令 最有效 的参数是-t ,可以将进程 中各个线程的具体 信息摆列 出来。
-r: 表现 缺页错误和内存利用 状态 ,缺页错误是程序必要 访问映射在假造 内存空间中但是还尚未被加载到物理内存中的一个分页,缺页错误两个重要 范例 是
minflt/s 指的 minor faults,当必要 访问的物理页面由于 某些缘故起因 (比如 共享页面、缓存机制等)已经存在于物理内存中了 ,只是在当进步 程 的页表中没有引用,MMU 只必要 设置对应的 entry 就可以了,这个代价是相称 小的
majflt/s 指的 major faults ,MMU 必要 在当前可用物理内存中申请一块空闲的物理页面(假如 没有可用的空闲页面,则必要 将别的物理页面切换到互换 空间去以开释 得到空闲物理页面),然后从外部加载数据到该物理页面中 ,并设置好对应的 entry,这个代价是相称 高的,和前者有几个数据级的差别
-s:栈利用 状态 ,包罗 StkSize 为线程保存 的栈空间,以及 StkRef 实际 利用 的栈空间 。利用 ulimit -s发现CentOS 6.x上面默认栈空间是10240K,而 CentOS 7.x、Ubuntu系列默认栈空间巨细 为8196K
-u:CPU利用 率环境 ,参数同前面雷同
-w:线程上下文切换的数量 ,还细分为cswch/s由于 等待 资源等因素导致的主动 切换,以及nvcswch/s线程CPU时间导致的被动切换的统计
假如 每次都先ps得到程序的pid后再操纵 pidstat会显得很贫苦 ,以是 这个杀手锏的-C可以指定某个字符串 ,然后Command中假如 包罗 这个字符串,那么该程序的信息就会被打印统计出来,-l可以表现 完备 的程序名和参数
? ~ pidstat -w -t -C “ailaw” -l
这么看来 ,假如 查察 单个尤其是多线程的任务 时间 ,pidstat比常用的ps更好使!
1.4
其他
当必要 单独监测单个 CPU 环境 的时间 ,除了 htop 还可以利用 mpstat ,查察 在 SMP 处理 惩罚 器上各个 Core 的工作量是否负载均衡 ,是否有某些热门 线程占用 Core。
? ~ mpstat -P ALL 1
假如 想直接监测某个进程 占用的资源,既可以利用 top -u taozj的方式过滤掉其他用户无关进程 ,也可以采取 下面的方式举行 选择,ps下令 可以自界说 必要 打印的条目信息:
while :; do ps -eo user,pid,ni,pri,pcpu,psr,comm | grep 'ailawd'; sleep 1; done
如想理清继承 关系,下面一个常用的参数可以用于表现 进程 树布局 ,表现 结果 比pstree具体 雅观 的多
? ~ ps axjf
二 、磁盘IO类
iotop 可以直观的表现 各个进程 、线程的磁盘读取及时 速率;lsof 不但 可以表现 平凡 文件的打开信息(利用 者),还可以操纵 /dev/sda1 这类装备 文件的打开信息,那么比如 当分区无法 umount 的时间 ,就可以通过 lsof 找出磁盘该分区的利用 状态了 ,而且添加 +fg 参数还可以额外表现 文件打开 flag 标记 。
2.1
iostat
? ~ iostat -xz 1
着实 无论利用 iostat -xz 1 还是 利用 sar -d 1,对于磁盘紧张 的参数是:
avgqu-s:发送给装备 I/O 哀求 的等待 队列均匀 长度,对于单个磁盘假如 值1表明装备 饱和 ,对于多个磁盘阵列的逻辑磁盘环境 除外
await(r_await、w_await):均匀 每次装备 I/O 哀求 操纵 的等待 时间(ms),包罗 哀求 分列 在队列中和被服务的时间之和;
svctm:发送给装备 I/O 哀求 的均匀 服务时间(ms),假如 svctm 与 await 很靠近 ,表现 险些 没有 I/O 等待 ,磁盘性能很好,否则磁盘队列等待 时间较长 ,磁盘相应 较差;
%util:装备 的利用 率,表明每秒中用于 I/O 工作时间的占比,单个磁盘当 %util60% 的时间 性能就会降落 (表现 在 await 也会增长 ) ,当靠近 100%时间 就装备 饱和了,但对于有多个磁盘阵列的逻辑磁盘环境 除外;
尚有 ,固然 监测到的磁盘性能比力 差,但是不肯定 会对应用程序的相应 造成影响 ,内核通常利用 I/O asynchronously 技能 ,利用 读写缓存技能 来改善性能,不外 这又跟上面的物理内存的限定 相制约了 。
上面的这些参数 ,对网络文件体系 也是受用的。
三 、网络类
网络性能对于服务器的紧张 性不问可知 ,工具 iptraf 可以直观的实际 网卡的收发速率 信息,比力 的简便 方便通过 sar -n DEV 1 也可以得到雷同 的吞吐量信息 ,而网卡都标配了最大速率信息,比如 百兆网卡千兆网卡,很轻易 查察 装备 的利用 率。
通常 ,网卡的传输速率并不是网络开辟 中最为关切的,而是针对特定的 UDP、TCP 毗连 的丢包率、重传率,以及网络延时等信息。
3.1
netstat
? ~ netstat -s
表现 自从体系 启动以来 ,各个协议的总体数据信息 。固然 参数信息比力 丰富有效 ,但是累计值,除非两次运行做差才华 得出当前体系 的网络状态信息,亦大概 利用 watch 眼睛直观其数值变革 趋势。以是 netstat通常用来检测端口和毗连 信息的:
netstat –all(a) –numeric(n) –tcp(t) –udp(u) –timers(o) –listening(l) –program(p)
–timers可以取消域名反向查询 ,加快 表现 速率 ;比力 常用的有
? ~ netstat -antp #列出全部 TCP的毗连
? ~ netstat -nltp #列出本地 全部 TCP侦听套接字,不要加-a参数
3.2
sar
sar 这个工具太强大 了,什么 CPU 、磁盘、页面互换 啥都管 ,这里利用 -n 重要 用来分析网络活动 ,固然 网络中它还给细分了 NFS、IP、ICMP 、SOCK 等各种条理 各种协议的数据信息,我们只关心 TCP 和 UDP。下面的下令 除了表现 通例 环境 下段、数据报的收发环境 ,还包罗
TCP
? ~ sudo sar -n TCP,ETCP 1
active/s:本地 发起的 TCP 毗连 ,比如 通过 connect(),TCP 的状态从CLOSED - SYN-SENT
passive/s:由长途 发起的 TCP 毗连 ,比如 通过 accept(),TCP 的状态从LISTEN - SYN-RCVD
retrans/s(tcpRetransSegs):每秒钟 TCP 重传数量 ,通常在网络质量差 ,大概 服务器过载后丢包的环境 下,根据 TCP 简直 认重传机制会发生重传操纵
isegerr/s(tcpInErrs):每秒钟吸取 到堕落 的数据包(比如 checksum 失败)
UDP
? ~ sudo sar -n UDP 1
noport/s(udpNoPorts):每秒钟吸取 到的但是却没有应用程序在指定目标 端口的数据报个数
idgmerr/s(udpInErrors):除了上面缘故起因 之外的本机吸取 到但却无法派发的数据报个数
固然 ,这些数据肯定 程度 上可以阐明 网络可靠性,但也只有同具体 的业务需求场景连合 起来才具故意 义 。
3.3
tcpdump
tcpdump 不得不说是个好东西。各人 都知道本地 调试的时间 喜好 利用 wireshark ,但是线上服务端出现题目 怎么弄呢?
附录的参考文献给出了思绪 :复原环境 ,利用 tcpdump 举行 抓包,当题目 复现(比如 日记 表现 大概 某个状态显现)的时间 ,就可以竣事 抓包了,而且 tcpdump 本身 带有 -C/-W 参数,可以限定 抓取包存储文件的巨细 ,当到达 这个这个限定 的时间 生存 的包数据主动 rotate,以是 抓包数量 总体还是 可控的。以后 将数据包拿下线来,用 wireshark 想怎么看就怎么看 ,岂不乐哉!tcpdump 固然 没有 GUI 界面,但是抓包的功能丝绝不 弱,可以指定网卡、主机 、端口、协议等各项过滤参数 ,抓下来的包完备 又带偶然 间戳,以是 线上程序的数据包分析也可以这么简单 。
下面就是一个小的测试,可见 Chrome 启动时间 主动 向 Webserver 发起创建 了三条毗连 ,由于这里限定 了 dst port 参数 ,以是 服务端的应答包被过滤掉了,拿下来用 wireshark 打开,SYNC、ACK 创建 毗连 的过程还是 很显着 的!在利用 tcpdump 的时间 ,必要 尽大概 的设置 抓取的过滤条件,一方面便于接下来的分析,二则 tcpdump 开启后对网卡和体系 的性能会有影响 ,进而会影响到在线业务的性能。
本文完!
作者:taozj
链接:https://taozj.org/201701/linux-performance-basic.html