http://bbs.chinaunix.net/thread-1936302-1-1.html
CPU负载观察及调优方法:I1,D1(两类一级缓存:一级指令和一级数据缓存)I2,D2都是cpu独有的,三级缓存可以共享SMP对称多处理机(SymmetricalMulti-Processing):多个cpu,访问同一个内存(三个时钟周期:联系内存控制器,寻址,完成读写);但是随着cpu个数增加,效率不行NUMA非一致性内存访问(Non Uniform Memory Access Architecture):每一个CPU与自己的专用内存CPU affinity: CPU绑定,防止交叉访问只有在红帽6以上才能有全的命令:numastat,numactl,numad,numa只是在硬件级别跟我们的cpu进行绑定在非NUMA架构下绑定:taskset: 绑定进程至某CPU上mask:0x0000 00030011:0和10x0000 0005: 0101: 0和2# taskset -p mask pidtaskset -p 0x00000003 101taskset -p -c 0-2,7 101 类似nginx绑定为了绑定后不进行切换:隔离a:/etc/grub.confisolcpus=cpu number,…,cpu numberb:应该将中断绑定至那些非隔离的CPU上,从而避免那些隔离的CPU处理中断程序;echo CPU_MASK > /proc/irq/<irq number>/smp_affinity 将中断绑定在cpu哪些核上如:假如我们CPU有16核,我们将中断绑定在0,1上echo 0x00000011 > /proc/irq/<irq number>/smp_affinityvmstat:vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。这个命令是我查看Linux/Unix最喜爱的命令,一个是Linux/Unix都支持,二是相比top,我可以看到整个机器的CPU,内存,IO的使用情况,而不是单单看到各个进程的CPU使用率和内存使用率(使用场景不一样)。一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:root@ubuntu:~# vmstat 2 1procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 1 0 0 3498472 315836 3819540 0 0 0 1 2 0 0 0 100 02表示每个两秒采集一次服务器状态,1表示只采集一次。实际上,在应用过程中,我们会在一段时间内一直监控,不想监控直接结束vmstat就行了,例如:复制代码root@ubuntu:~# vmstat 2 procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- r b swpd free buff cache si so bi bo in cs us sy id wa 1 0 0 3499840 315836 3819660 0 0 0 1 2 0 0 0 100 0Load average: average length of run queuessar -qtopwuptimevmstat 1 5CPU utilizationmpstat 1 2sar -P ALL 1 2iostat -c 1 2/proc/statdstat -c 复制代码这表示vmstat每2秒采集数据,一直采集,直到我结束程序,这里采集了5次数据我就结束了程序。r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。b 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。free 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。buff Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多Mcache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。in 每秒CPU的中断次数,包括时间中断cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。id 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。wt 等待IO CPU时间。sar:http://blog.chinaunix.net/uid-23177306-id-2531032.html默认监控: sar 5 5 // CPU和IOWAIT统计状态 http://blog.csdn.net/colin_liu2009/article/details/6862910(1) sar -P ALL 5 5 // 每颗CPU的使用状态信息和IOWAIT统计状态 (2) sar -q 5 5 // 队列的长度(等待运行的进程数)和负载的状态top:第一行是任务队列信息,同 uptime 命令的执行结果。其内容如下:top - 01:06:48 up 1:22, 1 user, load average: 0.06, 0.60, 0.4801:06:48 当前时间up 1:22 系统运行时间,格式为时:分1 user 当前登录用户数load average: 0.06, 0.60, 0.48 系统负载,即任务队列的平均长度。三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。Tasks: 29 total, 1 running, 28 sleeping, 0 stopped, 0 zombieCpu(s): 0.3% us, 1.0% sy, 0.0% ni, 98.7% id, 0.0% wa, 0.0% hi, 0.0% si第二、三行为进程和CPU的信息。当有多个CPU时,这些内容可能会超过两行。内容如下:Tasks: 29 total 进程总数1 running 正在运行的进程数28 sleeping 睡眠的进程数0 stopped 停止的进程数0 zombie 僵尸进程数Cpu(s): 0.3% us 用户空间占用CPU百分比1.0% sy 内核空间占用CPU百分比0.0% ni 用户进程空间内改变过优先级的进程占用CPU百分比98.7% id 空闲CPU百分比0.0% wa 等待输入输出的CPU时间百分比0.0% hi0.0% siMem: 191272k total, 173656k used, 17616k free, 22052k buffersSwap: 192772k total, 0k used, 192772k free, 123988k cached最后两行为内存信息。内容如下:Mem: 191272k total 物理内存总量173656k used 使用的物理内存总量17616k free 空闲内存总量22052k buffers 用作内核缓存的内存量Swap: 192772k total 交换区总量0k used 使用的交换区总量192772k free 空闲交换区总量123988k cached 缓冲的交换区总量。PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMANDTTY 启动进程的终端名。不是从终端启动的进程则显示为 ?PR 优先级NI nice值。负值表示高优先级,正值表示低优先级VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RESTIME+ 进程使用的CPU时间总计RES 进程使用的、未被换出的物理内存大小SHR 共享内存大小uptime同top第一行信息w:w命令的显示项目按以下顺序排列:当前时间,系统启动到现在的时间,登录用户的数目,系统在最近1秒、5秒和15秒的平均负载。然后是每个用户的各项数据,项目显示顺序如下:登录帐号、终端名称、远程主机名、登录时间、空闲时间、JCPU、PCPU、当前正在运行进程的命令行。$ w 2:50pm up 2 min, 4 users, load average:0.22,0.16,0.06 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty1 2:49pm 0:00s 0.56s 0.10s w foxy tty2 2:49pm 1:09 0.42s 0.42s bash root tty3 2:49pm 46.00s 0.67s 0.25s telnet bbs3 bbs ttyp0 river.net 2:49pm 45.00s 0.49s 0.49s bbs h river.netmpstat另一个用于获取 CPU 相关统计信息的有用的命令是 mpstat。下面是一个示例输出:# mpstat -P ALL 5 2Linux 2.6.9-67.ELsmp (oraclerac1) 12/20/2008 10:42:38 PM CPU %user %nice %system %iowait %irq %soft %idle intr/s10:42:43 PM all 6.89 0.00 44.76 0.10 0.10 0.10 48.05 1121.6010:42:43 PM 0 9.20 0.00 49.00 0.00 0.00 0.20 41.60 413.0010:42:43 PM 1 4.60 0.00 40.60 0.00 0.20 0.20 54.60 708.40 10:42:43 PM CPU %user %nice %system %iowait %irq %soft %idle intr/s10:42:48 PM all 7.60 0.00 45.30 0.30 0.00 0.10 46.70 1195.0110:42:48 PM 0 4.19 0.00 2.20 0.40 0.00 0.00 93.21 1034.5310:42:48 PM 1 10.78 0.00 88.22 0.40 0.00 0.00 0.20 160.48 Average: CPU %user %nice %system %iowait %irq %soft %idle intr/sAverage: all 7.25 0.00 45.03 0.20 0.05 0.10 47.38 1158.34Average: 0 6.69 0.00 25.57 0.20 0.00 0.10 67.43 724.08Average: 1 7.69 0.00 64.44 0.20 0.10 0.10 27.37 434.17它显示了系统中 CPU 的各种统计信息。–P ALL 选项指示该命令显示所有 CPU 的统计信息,而不只是特定 CPU 的统计信息。参数 5 2 指示该命令每隔 5 秒运行一次,共运行 2 次。以上输出首先显示了所有 CPU 的合计指标,然后显示了每个 CPU 各自的指标。最后,在结尾处显示所有 CPU 的平均值。让我们看一看这些列值的含义:%user 表示处理用户进程所使用 CPU 的百分比。%nice 表示使用 nice 命令对进程进行降级时 CPU 的百分比。在之前的部分中已经对 nice 命令进行了介绍。简单来说,nice 命令更改进程的优先级。%system 表示内核进程使用的 CPU 百分比%iowait 表示等待进行 I/O 所使用的 CPU 时间百分比%irq 表示用于处理系统中断的 CPU 百分比%soft 表示用于软件中断的 CPU 百分比%idle 显示 CPU 的空闲时间%intr/s 显示每秒 CPU 接收的中断总数当您拥有前面所述的 vmstat 时,您可能想知道 mpstat 命令的作用。差别很大:mpstat 可以显示每个处理器的统计,而 vmstat 显示所有处理器的统计。因此,编写糟糕的应用程序(不使用多线程体系结构)可能会运行在一个多处理器机器上,而不使用所有处理器。从而导致一个 CPU 过载,而其他 CPU 却很空闲。通过 mpstat 可以轻松诊断这些类型的问题。iostat:-c 仅显示CPU统计信息.与-d选项互斥.-d 仅显示磁盘统计信息.与-c选项互斥.# iostatLinux 2.6.9-8.11.EVAL (ts3-150.ts.cn.tlan) 08/08/2007avg-cpu: %user %nice %sys %iowait %idle 12.01 0.00 2.15 2.30 83.54Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtnhda 7.13 200.12 34.73 640119 111076各个输出项目的含义如下:avg-cpu段:%user: 在用户级别运行所使用的CPU的百分比.%nice: nice操作所使用的CPU的百分比.%sys: 在系统级别(kernel)运行所使用CPU的百分比.%iowait: CPU等待硬件I/O时,所占用CPU百分比.%idle: CPU空闲时间的百分比.Device段:tps: 每秒钟发送到的I/O请求数.Blk_read /s: 每秒读取的block数.Blk_wrtn/s: 每秒写入的block数.Blk_read: 读入的block总数.Blk_wrtn: 写入的block总数./proc/stat 在Linux系统中,可以用/proc/stat文件来计算cpu的利用率。这个文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。cat /proc/statcpu 65376847 362756 2405159 10834971593 3765180 93399 2395097 0cpu0 7680302 5263 111909 1355640955 47680 0 185343 0cpu1 6527638 2261 327795 1356540189 249151 1 24242 0cpu2 6239465 47114 200809 1354709532 2153662 3610 317002 0cpu3 7009912 36126 257576 1356116663 162851 1068 87068 0cpu4 6028713 1692 197911 1356919175 300788 6821 216076 0cpu5 7110575 1479 124474 1356297947 92620 4248 39901 0cpu6 7206763 241427 247384 1355030525 691206 11642 242214 0cpu7 17573475 27390 937298 1343716603 67218 66006 1283248 0intr 2466653411 753885765 3 0 4 4 0 0 0 1 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 52 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 148466005 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1553671397 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10630155 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21 0 0 0 0 0ctxt 2905526438btime 1260187150processes 4266007procs_running 5procs_blocked 0输出解释CPU 以及CPU0、CPU1、CPU2、CPU3、CPU4、CPU5、CPU6、每行的每个参数意思(以第一行为例)为:user (65376847) 从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies) ,不包含 nice值为负进程。1jiffies=0.01秒nice (362756) 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)system (2405159) 从系统启动开始累计到当前时刻,核心时间(单位:jiffies)idle (10834971593) 从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)iowait (3765180) 从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies) ,irq (93399) 从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)softirq (2395097) 从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)CPU时间=user+system+nice+idle+iowait+irq+softirq“intr”这行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数。“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。“btime”给出了从系统启动到现在为止的时间,单位为秒。“processes (total_forks) 自系统启动以来所创建的任务的个数目。“procs_running”:当前运行队列的任务的数目。“procs_blocked”:当前被阻塞的任务的数目。那么CPU利用率可以使用以下两个方法。先取两个采样点,然后计算其差值:cpu usage=(idle2-idle1)/(cpu2-cpu1)*100cpu usage=[(user_2 +sys_2+nice_2) - (user_1 + sys_1+nice_1)]/(total_2 - total_1)*100dstat如果系统没有些工具 yum -y install dstat安装下即妥,此软件小巧玲珑,软件包大小只有144k,安装大小660k。此工具默认情况下会动态显示CPU,disk,net,page,system负载情况-c cpu是也,显示CPU系统占用,用户占用,空闲,等待,中断,软件中断等信息上下文切换次数:sar -w查看上下文切换的平均次数,以及进程创建的平均值;vmstat将cpu分组(默认组为/) 例(建立 /cpusets cpu组) mkdir /cpusets grep cpu /proc/filesystems vim /etc/fstab mount -t cpuset nodev /cpusets/ mount -a ls /cpusets/ .....cpus.....mem....tasks... echo 1 > /cpusets/cpus (为/cpusets分配cpu) echo 0 > /cpusets/mems (为/cpusets分配mem) echo 3132 > /cpusets/tasks (进程号为3132的进程绑到cpusets组) cat /proc/3132/cpuset /cpusets (默认为/) (/cpusets/cpu_exclusive 此中的cpu只能在此cpu组运行) (/cpusets/notify_on_release 自动清理cpu组缓存开关)ps -eo psr,pid,cdm | grep httpd