写在前面:本文是对OSCon09的《Linux System and Performance Monitoring》一文的学习笔记,主要内容是总结了其中的要点,以及加上了笔者自己的一些理解。通过总结,一方面是为了加深笔者自己的理解,另一方面也是希望能对有需要的朋友有所帮助。

做为一名服务器开发工程师,经常会有分析系统性能,解决系统性能瓶颈的需求。通常我们所说的性能问题,不外乎就是CPU/Memory/IO/Network这四个方面,这四个方面每个都有各自独特之处,同时也都是相互关联的。下面就分别从这四个方面展开进行介绍。

CPU

基本概念

1. 内核调度的优先级:在Linux系统中,内核scheduler调度资源包括两种:threads(Process是由threads组成)和interrupt,这些被调度的资源是有特定的优先级的,以下从高到底:

    • Interrupts: Interrupt被设备用来通知内核相关的事件,优先级是最高的
    • Kernel(System) Processes:所有的系统进程都是以仅次于Interrupt的优先级被调度的
    • User Processes: 所有的应用程序都是run在用户态空间,以最低的优先级被内核调度

2. 上下文切换(Context Switch): 线程在运行过程中,CPU时间片用完,或者是被更高优先级的的资源抢占了CPU,该线程都会被放到一个等待队列,等待下一次被调度,这样的一次过程称为一次上下文切换。另外,在用户程序调用系统调用(System call)的时候,也会发生上下文切换(这个也有叫Mode Switch的, 确实跟前面两种情况有所区别)。

3. 运行队列(Run Queue)和负载(Load):

  • Run Queue: 在Linux系统中,每个CPU维护着一个run queue, 里面放着等待被执行的threads, run queue越大,在里面的线程等的时间越长
  • Load: Linux系统提供了1/5/15分钱的load, load是的值指的是当前running的threads数加上run queue中等待被执行的threads数

4. CPU利用率(Utilization):

  • User Time(us): CPU在用户空间运行线程所花的时间的百分比
  • System Time(sy): CPU执行内核线程和中断(interrupt)所花的时间的百分比
  • Wait IO(wa): 所有进程因为等待IO完成而被阻塞,导致CPU idle所花的时间的百分比
  • Idle(id): CPU完全idle的时间的百分比
常用工具

1. vmstat: vmstat是linux下非常强大的工具,它的结果包含了比较全面的CPU和Memory相关的指标,这里只介绍CPU相关的.
下图是vmstat使用时的一个截图:

下图是vmstat CPU相关指标的介绍:

2. top: top也是linux下比较常用的工具,它除了可以看系统整体的CPU/Memory使用情况,还可以单独看某个进程的每个线程的情况:
下图是top看整体情况(top打开之后,按数字键’1′, 可以展开每个cpu的情况):

下图是top -p $pid -H看指定进程的(top打开之后,按字母键’c’,可以查看进程的参数详情):

3. mpstat:mpstat是一个专门用来查看CPU使用情况的工具,通常用’mpstat -P ALL 2’来查看每个CPU的情况。这里最后面的数字’2’表示的是采样周期,Linux下有很多命令支持这样的参数,像sar/iostat/vmstat/mpstat等,很多资料是给的例子是用1,但在实践的过程中发现,用1的结果常常波动比较大,不稳定,所以在具体的实践中,笔者推荐用2或者更大一些的值,获得的结果相对稳定一些。

经验之谈

关于CPU,有下面一些经验可供参考:

  • Run Queue: 每个run queue最好不要超过3个threads在等待,转换到load, 就是load的值最好不要超过3倍的cpu核数,1倍核数是比较理想的状态,2-3倍是比较饱和的状态,再高就会影响系统正常运行了。
  • CPU Utilization: 推荐的比例是 us 60-70%, sy 30-35%, id 0-5%, 简单可以记us:sy=70:30, 这个是比较合适的比例,如果sy超过30,就会影响系统的正常运行
  • Context Switch: 上下文切换跟cpu利用率是直接相关的,如果cpu利用率符合上面说的比例,那么比较高的context switch是可以接受的

Memory

基本概念

1. Memory Pages: Linux系统中内存是以页(Page)为基本来存取的,默认的页大小是4096Bytes, Linux下内存页可以分为下面几种类型:

  • Unreclaimable – locked, kernel, reserved pages
  • Swappable – anonymous memory pages
  • Syncable – pages backed by a disk file
  • Discardable – static pages, discarded pages

2. kswapd: kswapd是用来保证系统有足够多的free memory的Linux daemon。它监控了内核的pages_high和pages_low这两个值,如果free memory的值低于pages_low, 它就会开始扫描内存并尝试free一些内存页,每次32个页,它会重复这个过程,一直到free memory的值达到pages_high这个值。kswapd在free内存页时,主要有下面几种情况:

  • 如果内存页没有被修改,它会直接放到free list
  • 如果内存页被修改了,而且该内存页是Syncable的,把该内存页的内容写回磁盘,然后把该内存页放到free list
  • 如果内存页被修改了,页且该内存页是Swappable(Anonymous)的,把该内存页写入到swap device, 然后把该内存页放到free list

3. pdflush: pdflush是用来把内存页同步到对应的磁盘文件的Linux daemon. 比如说,一个文件在内存中被修改了,那么pdflush会把它写到磁盘上。当内存页中有10%的dirty页的话,pdflush就开始向文件系统同步这些dirty页。这个阈值可以通过vm.dirty_background_ratio这个内核参数来配置,缺省是10%.

常用工具

1. vmstat: 前面提到的vmstat同样也是用来查看内存使用情况的利器, 下图是vmstat中内存相关指标的介绍:

2. top: top同样可以用来看内存的使用情况,包括系统整体的情况,也有单独每个进程的:
下图是系统整体的,其中total是总量,used/buffer/free跟vmstat的cache/buff/free是对应的:

下图是单个进程的,其中virt是该进程使用的虚拟内存的大小(memory + disk pages),res是使用的物理内存的大小(only memory pages):

经验之谈

关于memory, 有下面一些经验之谈:

  • 比较低的free memory大小,表明系统有效地使用了内存;除非是在大量、持续的写swap device
  • 如果系统在持续读、写swap device, 表明系统内存不够了

IO

基本概念

1. Page fault: 当应用程序要访问的数据不在正在使用的memory中的时候,就会发生page fault, 具体有下面两种类型的page faults:

  • Minor(MnPF): 数据在物理内存中,但在Fault发生的时候,还没在MMU(Memory Management Unit)登记,此时发生的Fault为Minor Page Fault.
  • Major(MPF): 数据不在物理内存中,需要从磁盘加载,此时发生的Fault为Major Page Fault.

2. File Buffer Cache: 它是系统发生IO时,系统与磁盘之间的Cache, 主要目的就是最大化MnPF, 最小化MPF。前文中vmstat/top的截图中,buff对应的就是它的大小。
3. Page Type: 前文中从回收的角度对memory page进行了分类,从IO的角度可以分为下面几类:

  • Read Pages:系统从磁盘加载的只读的Page, 这些Page会一直在内存中驻留,一直到系统内存紧张,内核才会将这些Page加入到free list,另做它用
  • Dirty Pages:系统从磁盘加载的Page, 并且做了修改。这些Page会被pdflush同步到磁盘。当系统内存紧张时,kswapd会将这些Page写入到磁盘
  • Anonymous Pages: 不属于某个进程的Page, 不能同步到磁盘。当系统内存紧张时,kswapd会将其swap到swap device, 以此来释放内存

4. 磁盘IOPS计算:

1
IOPS = 1000 / {((1 / (RPM / 60)) * 1000 / 2)[rotation] + 3[seek] + 2[latency]}

解释一下上面的公式:

  • rotation: 磁盘旋转时间,1/(RPM/60)是每转一圈所用的秒,*1000是转化为毫秒,/2是平均情况下,需要转半圈
  • seek: 寻道时间,3ms
  • latency: 数据传输时间,2ms
  • 最后用1000/(rotation + seek + latency)就是磁盘的IOPS,正常用的10000RPM的磁盘,算下来约是125 IOPS
常用工具

1. iostat: iostat是用来查看系统IO情况的利器, 下面介绍该工具:
iosat -k -d -x 2的结果:

上图中,比较常用的r/w这两列分别是每秒的读/写请求数,也即IOPS;rkB/wkB是每秒读写的数据量,也即throughput; 最后三列分别是io wait时间,io请求serve的时间,也即io利用率。

经验之谈

关于IO,有下面一些经验之谈:

  • iowait正常情况下应该是0,如果持续非0的话,就说明对应的io设备overloaded了
  • 根据你的磁盘转数,计算它所能承受的IOPS,以此来判断当前的iops是否正常
  • 顺序读和随机读有一定的差异,这个也是要考虑的因素
  • 如果要监控磁盘的话,可以考虑监控持续一段时间的iowait和svctm, 如果这两个值持续比较大的话,对应的磁盘设备很大可能有问题
  • 监控swap和file system分区,确认虚拟内存和fs IO之间没有竞争

Network

基本概念

1. 带宽: 当下比较常用的带宽用100Mbps, 1000Mbps, 10000Mbps,分别对应于我们平时提的百兆网、千兆网和万兆网。通常,我们在说带宽的时候,单位用的是bit, 但是在实际应用的时候,我们用的单位大多是Byte, 因此,上述三种网对应的Byte带宽分别约是12.5MBps, 125MBps, 1250MBps。

常用工具

1. sar: sar是一个全面的工具,这里介绍用它来看系统网络情况:

2. iptraf: 查看指定设备实时的throughput
下图是iptraf -d em1的结果:

经验之谈

关于Network, 有下面一些经验之谈:

    • 关于网络,最重要的就是查看的是网络带宽的使用是否符合预期,注意(bit/Byte)转换,另外也要注意上下行是独立的

Linux System and Performance Monitoring的更多相关文章

  1. PostgreSQL Performance Monitoring Tools

    PostgreSQL Performance Monitoring Tools https://github.com/CloudServer/postgresql-perf-tools This pa ...

  2. ITU-T G.1081 IPTV性能监测点 (Performance monitoring points for IPTV)

    ITU-T 建议书 G.1081 IPTV性能监测点 Performance monitoring points for IPTV Summary Successful deployment of I ...

  3. (copy) Shell Script to Check Linux System Health

    source: http://linoxide.com/linux-shell-script/shell-script-check-linux-system-health/ This article ...

  4. The frequent used operation in Linux system

    The frequently used operation in Linux system    2017-04-08 12:48:09  1. mount the hard disk:  #: fd ...

  5. Linux System.map文件【转】

    转自:http://blog.csdn.net/ysbj123/article/details/51233618 当运行GNU链接器gld(ld)时若使用了"-M"选项,或者使用n ...

  6. How to rebuild RPM database on a Red Hat Enterprise Linux system?

    本文是笔者最近遇到的一个故障的处理过程,解决方案是Rebuild RPM 的DB,后面内容其实是REDHAT官方的solutions,不过我遇到的现象和解决方案都与官方有点出入,故一直帖出来: 我遇到 ...

  7. Howto Reboot or halt Linux system in emergency (ZT)

    http://www.cyberciti.biz/tips/reboot-or-halt-linux-system-in-emergency.html Linux kernel includes ma ...

  8. Linux system log avahi-daemon[3640]: Invalid query packet.

    2014-06-11 Check the Linux system log find the errorr: Jun  9 11:18:49 hostname avahi-daemon[3640]: ...

  9. Linux System

    Linux System linux 是一个功能强大的操作系统,同时它是一个自由软件,是免费的.源代码开放的,编制它的目的是建立不受任何商品化软件版权制约的.全世界都能自由使用的UNIX兼容产品.各种 ...

随机推荐

  1. nodejs入门

    一.Nodejs介绍 简单的说 Node.js 就是运行在服务端的 JavaScript的代码解析器. 首先要清楚Node不是一个Web服务器,这十分重要.它本身并不能做任何事情.它无法像Apache ...

  2. css3中变形与动画(二)

    css3制作动画的几个属性:变形(transform),过渡(transition)和动画(animation). transform介绍过了.接下来介绍过渡transition. 一.例子 先通过一 ...

  3. linux tar命令简介

    一.使用介绍 1.名词区分 打包:将一大堆文件或目录变成一个总的文件[tar命令] 压缩:将一个大的文件通过一些压缩算法变成一个小文件[gzip,bzip2等] Linux中很多压缩程序只能针对一个文 ...

  4. [书目20160612]思考软件,创新设计——A段架构师的思考技术

    高焕堂:在校时期主修统计学和信息管理,将近40年软件开发生涯.工作于亚洲和欧美各地区,专精于商业策略思考和系统架构设计.近年来,热衷于<it+设计>教育顾问和产品开发. 第1章  商业思维 ...

  5. leetcode-HouseRobber

    这道题比较简单,所以我会介绍的比较粗略: 题目: 有一个小偷想沿着马路上的房子偷东西,每家每户都有一些钱,但这条街上装了监控系统,如果相邻的两户人家都被偷了的话那么就会触发报警器.小偷的目标就是在不触 ...

  6. CSS样式----图文详解:css样式表和选择器

    主要内容 CSS概述 CSS和HTML结合的三种方式:行内样式表.内嵌样式表.外部样式表 CSS四种基本选择器:标签选择器.类选择器.ID选择器.通用选择器 CSS三种扩展选择器:组合选择器.后代选择 ...

  7. JAVA代码中加了Try...Catch的执行顺序

    public static String getString(){ try { //return "a" + 1/0; return "a"; } catch ...

  8. [转]关于vs调试正确。但是发布到iis就出现无法访问后天局面

    最近使用extjs+ashx进行ajax请求过程操作的时候发现一个问题..当我把程序发布到iis的时候就出现一只不执行到success回调函数. 当弹出状态值一看尽然是500.我就纳闷了.又没有语法错 ...

  9. 漂浮QQ

    漂浮QQ 点击下载

  10. php碎片

    1.flock LOCK_EX 独占锁定 LOCK_SH 共享锁定 LOCK_UN 解除锁定 LOCK_NB 锁定但不堵塞进程,直接返回false 2. fseek SEEK_CUR SEEK_END ...