确保系统稳健运行,巴黎人手机版:1). 增加CPU以
分类:巴黎人-服务器

Linux-CPU性能优化,

前言

何为性能优化?个人认为,性能优化是为了提高应用程序或系统能力为目的。那么如何才能实现对应用程序的性能调优呢?这里很设计到很多的内容,包括Linux内核、CPU架构以及Linux内核对资源的分配以及管理,了解进程的创建过程等。这方面由于篇幅较多,所以我的文章就不过多介绍。接下来的几篇文章中,都是讲解如何发现应用程序故障根源为目标讲解,这也是每一个系统工程师应该具备的能力。废话不多说,我直接进入主题。

常用术语

  延时:延时是描述操作之后用来等待返回结果的时间。在某些情况下,它可以指的是整个操作时间,等同于响应时间。

  IOPS:每秒发生的输入/输出操作的次数,是数据传输的一个度量方法。对于磁盘的读写,IOPS指的是每秒读写的次数。

  响应时间:一般操作完成的时间。包括用于等待和服务的时间,也包括用来返回结果的时间。

  使用率:对于服务所请求的资源,使用率描述在所给定时间区间内资源的繁忙程度。对于春初资源来说,使用率指的就是所消耗的存储容量。

  饱和度:指的就是某一资源无法满足服务的排队工作量。

  吞吐量:评价工作秩序的速率,尤其是在数据传输方面,这个属于用于数据传输速度(字节/秒和比特/秒)。在某些情况下,吞吐量指的是操作的速度。

Linux内核功能

  CPU调度级别:各种先进的CPU调度算法,非一直存储访问架构(NUMA);

  I/O调度界别:I/O调度算法,包括deadline/anticipatory和完全公平队列(CFQ);

  TCP网络阻塞:TCP拥堵算法,允许按需选择;

常见问题

进程、线程和任务之间的区别是什么?

  进程通常定义为程序的执行。用以执行用户级别程序的环境。它包括内存地址空间、文件描述符、线程栈和寄存器。
  线程是某一进程中单独运行的程序。也就是说线程在进程之中。
  任务是程序完成的某一活动,可以使一个进程,也可以是一个线程。

参考连接:

什么是上下文切换?

  执行一段程序代码,实现一个功能的过程介绍,当得到CPU的时候,相关的资源必须也已经就位,就是显卡、内存、GPS等,然后CPU开始执行。这里除了CPU以外所有的就构成了这个程序的执行环境,也就是我们所定义的程序上下文。当这个程序执行完或者分配给他的CPU执行时间用完了,那它就要被切换出去,等待下一次CPU的临幸。在被切换出去的最后一步工作就是保存程序上下文,因为这个是下次他被CPU临幸的运行环境,必须保存。

I/O密集型和CPU密集型工作负载之间的区别?

  I/O密集型指的是系统的CPU耗能相对硬盘/内存的耗能能要好很多,此时,系统运作,大部分的状况是 CPU 在等 I/O(硬盘/内存)的读/写,此时CPU负载不高。CPU密集型指的是系统的硬盘/内存耗能相对CPU的耗能要好很多,此时,系统运作,大部分的状况是 CPU负载 100%,CPU 要读/写 I/O (硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU负载很高。一般而言CPU占用率相当高,大部份时间用来做计算、逻辑判断等CPU动作的程序。

应用程序性能技术

1.选择I/O尺寸
  执行I/O的开销包括初始化缓冲区、系统调用、上下文切换、分配内核元数据、检查进程权限和限制、映射地址到设备、执行内核和驱动代码来执行I/O,以及在最后释放元数据和缓冲区。增加I/O尺寸是应用程序提高吞吐量的常用策略。
2.缓存
  操作系统用缓存提高文件系统的读性能和内存的分配性能,应用程序使用缓存也处于类似的原因。将经常执行的操作结果保存在本地缓存中以备后用,而非总是执行开销较高的操作。
3.缓冲区
  为了提高写操作性能,数据在送入下一层级之前会合并并放在缓冲区中。这样会增加写延时,因为第一次写入缓冲区后,在发送之前,还要等待后续的写入。

  1. 并发和并行
      并行:装在和开始执行多个可运行程序的能力(比如,同时接电话和吃饭)。为了利用多核处理器系统的优势,应用程序需要在同一时间运行在多颗CPU上,这种方式称为并行。应用程序通过多进程或多线程实现。
      并发:有处理多个任务的能力,不一定要同时。比如,接完电话在去吃饭,存在资源抢占;
      同步原语:同步原语监管内存的访问,当不允许访问时,就会引起等待时间(延时)。常见三种类型:
      mutex锁:只有锁持有者才能操作,其他线程会阻塞并等待CPU;
      自旋锁:自旋锁允许锁持有者操作,其他的需要自旋锁的线程会在CPU上循环自选,检查锁是否被释放。虽然这样可以提供低延时的访问,被阻塞的线程不会离开CPU,时刻准备着运行知道锁可用,但是线程自旋、等待也是对CPU资源的浪费。
      读写锁:读/写锁通过允许多个读者或者只允许一个写者而没有读者,来保证数据的完整性。
      自适应自旋锁:低延迟的访问而不浪费CPU资源,是mutex锁和自旋锁的混合。
    5.绑定CPU

关于CPU性能分析

uptime:
  系统负载,通过汇总正在运行的线程数和正在排队等待运行的线程数计算得出。分别反映1/5/15分钟以内的负载。现在的平均负载不仅用来表示CPU余量或者饱和度,也不能单从这个值推断出CPU或者磁盘负载。

vmstat:
  虚拟内存统计信息命令。最后几列打印系统全局范围内的CPU使用状态,在第一列显示可运行进程数。如下所示:

1234 [[email protected] ~]# vmstat procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----r  b   swpd   free   buff   cache   si   so    bi    bo   in   cs us sy id  wa  st0  0   0    14834208 158384 936512  0     0     0     0    1   3   0  0 100  0  0

提示:

  r: 运行队列长度和正在运行的线程数;

  b: 表示阻塞的进程数;

  swpd: 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器;

  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没有充分利用,是不可取的。

  st: cpu在虚拟化环境上在其他租户上的开销;

mpstat:
  多处理器统计信息工具,能够报告每个CPU的统计信息。

1234567891011121314151617 [[email protected] ~]# mpstat -P ALL 1Linux 2.6.32-573.el6.x86_64 (zbredis-30104)     09/14/2017  _x86_64_    (12 CPU) 03:14:03 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle03:14:04 PM  all    0.00    0.00    0.08    0.00    0.00    0.00    0.00    0.00   99.9203:14:04 PM    0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.0003:14:04 PM    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.0003:14:04 PM    2    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.0003:14:04 PM    3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.0003:14:04 PM    4    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.0003:14:04 PM    5    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.0003:14:04 PM    6    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.0003:14:04 PM    7    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.0003:14:04 PM    8    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.0003:14:04 PM    9    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.0003:14:04 PM   10    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.0003:14:04 PM   11    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

提示:

  irq: 硬件中断CPU用量;

  sofr: 软件中断CPU用量;
  steal: 耗费在服务其他租户的时间;
  guest: 花在访客虚拟机的时间;

  重要关注列有%user/%sys/%idle。显示了每个CPU的用量以及用户态和内核态的时间比例。可以根据这些值查看那些跑到100%使用率(%user + %sys)的CPU,而其他CPU并未跑满可能是由单线程应用程序的负载或者设备中断映射造成。

sar:

  系统活动报告器。用来观察当前的活动,以及配置用以归档和报告历史统计信息。基本上所有资源使用的信息,它都能够查看到。具体的参数说明如下所示:

  -A: 所有报告的总和,类似"-bBdqrRSuvwWy -I SUM -I XALL -n ALL -u ALL -P ALL"参数一起使用;
  -b: 显示I/O和传输速率的统计信息;
  -B:显示分页状态;
  -d:硬盘使用报告;
  -r:内存和交换空间的使用统计;
  -g:串口I/O的情况;
  -b:缓冲区使用情况;
  -a:文件读写情况;
  -c:系统调用情况;
  -n: 统计网络信息;
  -q:报告队列长度和系统平均负载;
  -R:进程的活动情况;
  -y:终端设备活动情况;
  -w:系统交换活动;
  -x { pid | SELF | ALL }:报告指定进程ID的统计信息,SELF关键字是sar进程本身的统计,ALL关键字是所有系统进程的统计;

常用参数组合:

  查看CPU:

  整体CPU统计— sar -u 3 2,表示采样时间为3秒,采样次数为2次;
  各个CPU统计— sar -P ALL 1 1,表示采样时间为1秒,次数为1次;

    1. 若 %iowait 的值过高,表示硬盘存在I/O瓶颈;
    2. 若 %idle 的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量;
    3. 若 %idle 的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU;

  查看内存:

  查看内存使用情况 - sar -r 1 2

    kbcommit:保证当前系统所需要的内存,即为了确保不溢出而需要的内存(RAM+swap);
    %commit:这个值是kbcommit与内存总量(包括swap)的一个百分比;

  pidstat:主要用于监控全部或指定进程占用系统资源的情况,如CPU,内存、设备IO、任务切换、线程等。

  cpu使用情况统计
    执行 "pidstat -u" 与单独执行 "pidstat"
  内存使用情况统计
    pidstat -r -p PID 1

    minflt/s: 每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page fault次数;
    majflt/s: 每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,这样的page fault为major page fault,一般在内存使用紧张时产生;
  IO情况统计
    pidstat -d 1 2

关于CPU方面的优化

  1.编译器优化
  2.调度优先级和调度类(设置nice值)
    例如,nice -n 19 command
    renice 更改已经运行进程的优先级;
    chrt 命令显示并直接修改优先级和调度策略;
  3.进程绑定(一个进程可以绑定在一个或者多个CPU上)
    例如,taskset -pc 0-3 10790

  4.独占CPU
  5.BIOS调优

    启用睿频

出处:

参考:

查看评论

前言 何为性能优化?个人认为,性能优化是为了提高应用程序或系统能力为目的。那么如何才能实现对应用程序的性能...

一:CPU

  1. 用户态CPU是指执行应用程序代码的时间占总CPU时间的百分比。

系统态CPU是指应用执行操作系统调用的时间占总CPU时间的百分比。系统态CPU高意味着共享资源有竞争或者I/O设备之间有大量的交互。

提高应用性能和扩展性的一个目标就是尽可能降低系统态CPU使用率。

  1. CPU运行队列就是那些已经准备好运行、正等待可用CPU的轻量级进程。

当运行队列长度达到处理器的4倍或者更多时,系统的相应就非常迟缓了。

解决运行队列长有两种办法:

1). 增加CPU以分担负载;

2). 分析系统中运行的应用,改进CPU使用率;

1.top命令

linux是当前在服务器领域最成功操作系统,不仅性能卓越,安全性高,更重要的是提供了一套完善的监控机制,来检测系统内存、网络、cpu等运转情况,从而让用户做出应对方案,确保系统稳健运行。在工作中,常用的监控方式主要有以下命令。

概述

1. vmstat

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 104956    868 825812    0    0     1     5   16   25  0  0 100  0  0

r:CPU运行队列长度,值是运行队列中轻量级进程的实际数量

us:用户态CPU使用率

sy:系统态CPU使用率

id:CPU空闲率

top命令能够实时显示系统中各个进程的资源占用状况。使用top命令输出如下:

uptime

uptime命令可以查看当前系统的负载,运行结果如下:

11:34:31 up 86 days, 19:39,  2 users,  load average: 0.00, 0.01, 0.00

主要是最后3个数,表示1,5,15分钟内系统负载,如果该值除以逻辑cup个数,结果大于5表明系统负荷过大。

这里的系统负载定义为CPU在特定时间间隔内运行队列中的平均进程数,进程进入队要满足下列条件:

  • 没有在等待I/O操作的结果
  • 没有主动进入等待状态,即没有调用wait
  • 没有被停止

一般来说,每个cpu内核的负载不大于3,则系统表现良好。如果cpu是4核,那么只要负载不大于12说明系统良好,如果超过12,系统就处于高负载状态,需要注意了。

扩展:cat /proc/loadavg运行结果如下:

0.00 0.02 0.00 2/182 16802

前3个数和uptime命令后3个数含义相同,表示系统负载,后面的数是当前运行进程数/总进程数, 最后一个数表示最近运行的进程id。

[root@localhost ~]# rpm -qa|grep sysst
sysstat-9.0.4-22.el6.x86_64
mpstat是MultiProcessor Statistics的缩写,是实时系统监控工具。其报告与CPU的一些统计信息,这些信息存放在/proc/stat文件中。在多CPUs系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。下面只介绍mpstat与CPU相关的参数,mpstat的语法如下:
mpstat [-P {|ALL}] [internal [count]]

2. top

top - 09:42:04 up 3 days, 3 min,  1 user,  load average: 0.00, 0.01, 0.05
Tasks: 108 total,   3 running, 105 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1015472 total,   104568 free,    84224 used,   826680 buff/cache
KiB Swap:        0 total,        0 free,        0 used.   727760 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                          
  784 root      20   0  553064  16340   5748 S  0.0  1.6   0:21.48 tuned                                                                                            
  743 root      20   0  110512  13140    676 S  0.0  1.3   0:00.13 dhclient                                                                                         
 9678 polkitd   20   0  527456  13128   4680 S  0.0  1.3   0:00.09 polkitd                                                                                          
    1 root      20   0   43684   6176   3804 S  0.0  0.6   0:05.08 systemd                                                                                          

上半部分是整个系统的统计信息,下半部分是进程的统计信息。

P 按CPU占用率排序
M 按内存占用率排序
T 按CPU占用时间排序
H 查看详细线程信息

巴黎人手机版 1

vmstat

vmstat能够输出指定时间间隔的一些系统核心指标,包括cpu使用率、内存使用率、虚拟内存交换、IO读写等,以便让我们更详细的了解系统的运行状态,执行结果如下:

r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
0  0      0 466688 267644 1967496    0    0     0     5    1    1  2  0 98  0  0    
1  0      0 466672 267644 1967516    0    0     0    28  331  481  0  1 99  0  0    
0  0      0 466796 267644 1967520    0    0     0     4  468  518  2  1 97  0  0    
  • r:运行队列大小(队列中等待分配CPU资源的进程数),该数据比平均负载更能体现cpu的负载情况,不包含等待io的进程,如果该数据达到cpu核数,说明cup资源已经饱和并出现瓶颈,一般超过3就比较高,超过5就高,超过10就危险了。
  • b:阻塞进程数。
  • swpd:虚拟内存使用大小,如果大于0,则内存不足,不是OOM引起的话,就表明要升级内存了,或者把耗内存的任务移出。
  • free:空闲的物理内存。
  • buff:缓存文件的权限等元数据。
  • cache:缓存打开的文件,是为了提高程序运行的性能,当使用时,buff/cache会很快被使用。
  • si:每秒从磁盘读入虚拟内存的大小,如果该数据大于0,表示物理内存泄露或者不足。
  • so:每秒从虚拟内存读入磁盘的大小,大于0,同si。
  • bi:块设备(磁盘)每秒接收的块数量,默认块大小1kB,磁盘写入速度差不都140M/s。
  • bo:块设备(磁盘)每秒发送的块数量,bi、bo要接近0,否则就是io频繁,要处理。
  • in:每秒cpu中断次数。
  • cs:上下文切换频率。

线程上下文切换、系统函数调用等都会造成cpu上下文切换,该值越小越好,大了就要考虑减少线程/进程数量,使其有一个合适的值。
通常通过压测,调整进程/线程数量,直到cs的值满足要求,从而找到一个合适的值。(注:切换耗时10ms,则每秒每个cpu可切换100次,在10-20倍的范围算正常,即cs值在1000-2000内还正常)。上下文切换很消耗cpu资源,如果cpu大部分时间都用在上下文切换上,干正事的时间就少了,就不会充分利用cpu。

  • us:用户cpu时间。
  • sy:系统cpu时间,如果太高,表示系统调用时间过长,如IO操作频繁。
  • id(idle):空闲cpu时间,us+sy+id=100。
  • wa(wait):io等待造成的cup时间消耗,如果数值较大,可以说明系统的瓶颈在磁盘io。
  • st(stolen):cpu被偷走的时间,一般被虚拟机消耗。

总结的说,CPU性能监控包含以下方面:

二:内存

1. 系统在使用页面交换或虚拟内存时,访问swap中内存以及JVM垃圾回收swap中内存时,都存在内存置换(从swap中置换到内存),性能肯定有问题;

2. 锁竞争,一般来说让步时钟周期占用3%—5%或更多,说明java应用正面临锁竞争;

前半部分是统计信息,后半部分是进程信息。

mpstat

mpstat命令报告一些cpu的统计信息,在多核cpu中,不仅能查看全部cpu的指标均值,还能够查看一个cpu的指标信息,mpstat -P[] 1(internal) 2(count)运行如下:

07:21:21 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
07:21:22 PM  all    0.00    0.00    0.50    0.00    0.00    0.00    0.00    0.00   99.50
07:21:23 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
Average:     all    0.00    0.00    0.25    0.00    0.00    0.00    0.00    0.00   99.75

-P=[0,核数-1]

  • usr:用户cpu时间占比,不包含nice值为负数的进程。
  • nice:nice值为负数的进程cpu时间占比。
  • sys:系统(核心)cpu时间占比。
  • iowait:硬盘io等待cpu时间占比,如果过大,说明系统磁盘io频繁,磁盘io可能出现瓶颈。
  • irq:cpu中断时间占比。
  • soft:cup软中断时间占比。
  • steal:
  • guest:
  • idle:cpu空间时间占比,除去io等待空闲。

如果一个cpu占用率很高,可能是由一个单线程程序引起的。

检查系统的运行队列,确保每一个CPU的运行队列不大于3.

vmstat

free:可用空闲内存;

si:内存页面换入;

so:内存页面换出;

       统计信息中:

pidstat

pidstat命令报告进程的cpu占用率(-u default),内存占用率(-r),io情况(-d),可统计所有进程数据,也可以查看指定进程数据(-p),cpu占用率结果如下:

07:39:46 PM       PID    %usr %system  %guest    %CPU   CPU  Command
07:39:47 PM     21609    0.00    1.00    0.00    1.00     0  java

07:39:47 PM       PID    %usr %system  %guest    %CPU   CPU  Command
07:39:48 PM     21609    1.00    0.00    0.00    1.00     0  java

内存占用率结果如下:

07:44:49 PM       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
07:44:50 PM       497    198.00      0.00  101164   1036   0.03  pidstat
07:44:50 PM     21609      4.00      0.00 2439932  79172   2.02  java
  • minflt/s:每秒次缺页错误次数,次缺页错误指的是虚拟内存地址映射到物理内存地址产生的page default次数。
  • majflt/s:每秒主缺页错误次数,主缺页错误指的是虚拟内存地址映射到物理内存地址产生的major page default次数,通常在内存紧张时产生。
  • VSZ:使用的虚拟内存KB。
  • RSS:使用的物理内存KB。
  • MEM:使用的内存百分比。

磁盘io情况如下:

07:52:07 PM       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
07:54:02 PM     13885      0.00      0.00      0.00  java
07:54:03 PM     13885      0.00      0.00      0.00  java
  • kB_rd/s:进程每秒读取的数据量。
  • kB_wr/s:进程每秒写入的数据量。

确保CPU使用分布满足70/30原则(用户70%,系统30%)。

pidstat

[test ~]$ pidstat -w -I -p 7938 5
Linux 3.10.0-229.20.1.el7.x86_64 (test)     11/13/2016  _x86_64_    (1 CPU)

07:56:42 PM   UID       PID      cswch/s     nvcswch/s  Command
07:56:47 PM     0      7938      3500.00     0.00  java
07:56:52 PM     0      7938      3500.00     0.00  java
07:56:57 PM     0      7938      3500.00     0.00  java

Average:        0      7938      3500.00     0.00  java

cswch/s:让步式上下文切换;

例如:处理器为3.0GHz双核,每个处理器上下文切换3500/2=1750,耗费的时钟周期1750*80000=140000000,因此上下文切换所占比例为:140000000/3000000000=4.7

   第一行:任务队列:<=>uptime命令。左->右依次:系统当前时间、系统运行时间、当前登录用户数。load average:系统的平均负载,即任务队列的平均长度,3个值分别表示:1分钟,5分钟,15分钟登到现在的平均值。

iostat

iostat主要查看磁盘io情况,iostat -k 1运行结果如下:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.50    0.00    0.00    0.00    0.00   99.50

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
vda               0.55         0.03         3.72     156733   20788752
vdb               0.05         0.00         1.18       9273    6586332

-k 表示块单位转换为kb,-d表示显示设备名称(default),-x获得更多的统计信息,-c获取cpu的一些信息avg-cpu。

  • tps:每秒传输的次数,即每秒io请求次数。
  • kB_read/s:每秒从硬盘读取字节数。
  • kB_wrtn/s:每秒写入硬盘字节数。
  • kB_read:读取字节数。
  • kB_wrtn:写入字节数。

iostat -x -k 1运行结果如下:

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
vdb               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
  • rrqm/s:每秒进行merge的读操作数目。
  • wrqm/s:每秒进行merge的写操作数据。
  • r/s:每秒读磁盘次数。
  • w/s:
  • rkB/s:
  • wkB/s
  • avgrq-sz:平均每次I/O操作数据大小。
  • avgqu-sz:平均每次I/O操作队列长度。
  • await:平均每次I/O操作等单时间。
  • r_await:
  • w_await:
  • svctm:平均每次设备I/O操作的服务时间。
  • %util:一秒中有百分之多少的时间用于 I/O 操作。

如果%util接近100%,则I/O请求过载,磁盘可能存在瓶颈。

如果系统时间过长,可能是因为频繁的调度和改变优先级。

三:网络

分布式Java应用的性能和扩展性受限于网络带宽或网络I/O的性能。

   第二行:进程统计信息:左->右依次:正在运行的进程数、睡眠进程数、停止的进程数、僵尸进程数。

free

free用来查看内存情况,free -m执行结果如下:

             total       used       free     shared    buffers     cached
Mem:          3832       3154        677          0        269       2075
-/+ buffers/cache:        810       3022
Swap:            0          0          0

-m以M单位显示,默认是kB

  • Mem:从OS层面来看内存情况。
    ** shared:被进程共享的内存,已经deprecated。
    ** buffers:被os buffer的内存。
    ** cached:被os cache的内存。
  • -/+ buffers/cache:从应用程序角度来看内存情况。
    ** -buffers/cache:应用程序认为系统被用掉多少内存。
    ** +buffers/cache:应用程序认为系统剩余多少内存。
  • Swap:交换区信息。

buffer和cache的进一步理解:

buffer:A buffer is something that has yet to be "written" to disk.

cache:A cache is something that has been "read" from the disk and stored for later use.

都是为了提高I/O性能,由os管理,为了提高I/O性能,就要多cache数据,所以通常看cache比free大。

CPU Bound进程总是会被惩罚(降低优先级)而IO Bound进程总会被奖励(提高优先级)。

nicstat

需要编译安装()

    Time      Int   rKB/s   wKB/s   rPk/s   wPk/s    rAvs    wAvs %Util    Sat
13:25:57     eth0    2.34    1.77    2.84    2.29   842.6   789.6  0.00   0.00
13:25:57       lo    0.00    0.00    0.00    0.00   85.49   85.49  0.00   0.00

Int:网络接口设备名

rKb/s:每秒读取的KB数

wKb/s:每秒写入的KB数

%Util:网络使用率

Sat:饱和度

  第三行:CPU统计信息,

sar

sar命令格式 sar [options(-u)] [-o file] t n,该命令很强大,根据不同参数,报告不同的统计数据,可以统计cpu、硬盘、网卡等很多信息。
sar -n DEV 1报告网卡流量统计,执行结果如下:

04:01:05 PM     IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s
04:01:06 PM        lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00
04:01:06 PM      eth0      1.01      4.04      0.07      7.79      0.00      0.00      0.00
04:01:06 PM      eth1      1.01      2.02      0.08      0.11      0.00      0.00      0.00

-n网卡信息统计,DEV显示网络信息、EDEV显示关于网络错误信息、SOCK显示套接字信息、FULL显示全部。

  • rxpck/s:每秒接收数据包。
  • txpck/s:
  • rxkB/s:每秒接收字节。
  • txkB/s:
  • rxcmp/s:每秒接收压缩数据包。
  • txcmp/s:
  • rxmcst/s:每秒接收的多播数据包。

sar -b 1报告磁盘、缓冲区I/O情况,执行结果如下:

11:38:56 AM       tps      rtps      wtps   bread/s   bwrtn/s
11:38:57 AM      0.00      0.00      0.00      0.00      0.00
11:38:58 AM      0.00      0.00      0.00      0.00      0.00
11:38:59 AM      1.98      0.00      1.98      0.00     23.76
11:39:00 AM      0.00      0.00      0.00      0.00      0.00
  • tps:每秒进行磁盘读写的次数。
  • rtps:
  • wtps:
  • bread/s:每秒读取的字节数。
  • bwrtn/s:

sar -r 1报告swap空间使用情况,执行结果如下:

11:35:25 AM kbmemfree kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit
11:35:26 AM    707808   3216608     81.96    276200   2146784   2523160     64.29
11:35:27 AM    707808   3216608     81.96    276200   2146784   2523160     64.29
11:35:28 AM    707808   3216608     81.96    276200   2146784   2523160     64.29
11:35:29 AM    707808   3216608     81.96    276200   2146784   2523160     64.29
11:35:30 AM    707808   3216608     81.96    276200   2146784   2523160     64.29
11:35:31 AM    707808   3216608     81.96    276200   2146784   2523160     64.29

sar -u 1报告cpu使用情况,执行结果如下:

11:41:43 AM     CPU     %user     %nice   %system   %iowait    %steal     %idle
11:41:44 AM     all      0.50      0.00      0.00      0.00      0.00     99.50
11:41:45 AM     all      0.00      0.00      0.50      0.00      0.00     99.50
11:41:46 AM     all      0.00      0.00      0.00      0.00      0.00    100.00
11:41:47 AM     all      0.00      0.00      0.50      0.00      0.00     99.50
11:41:48 AM     all      2.00      0.00      0.50      0.00      0.00     97.50

sar -w 1报告上下文切换统计,执行结果如下:

11:42:44 AM    proc/s   cswch/s
11:42:45 AM      0.00    382.83
11:42:46 AM      0.00    364.00
11:42:47 AM      0.00    336.00
11:42:48 AM      1.00    379.00

-x报告指定进程的统计信息,如进程运行在那个cpu上、进程cpu占用情况等;-A显示全部信息,不在一个个说明。

正如我们之前讨论的任何系统的性能比较都是基于基线的,并且监控CPU的性能就是以下3点,运行队列、CPU使用率和上下文切换。

四:磁盘

              us:用户空间CPU占用率、

top

top命令也很强大,包含了前面好几个命令检查的内容,如系统负载情况(uptime),内存使用情况(free),cpu使用情况(vmstat)等。通过top命令,可以相对全面查看系统的负载及其原因。同时,top命令支持排序,可以按照不同的列排序,方便查找出诸如内存占用最多的进程、CPU占用率最高的进程等。
top [options] options主要如下:

  • -i设置时间间隔
  • -u设置用户
  • -p设置进程号
  • -n设置循环次数

top的输出是一个瞬时值,执行结果如下:

top - 16:51:11 up 69 days, 21:54,  1 user,  load average: 0.00, 0.00, 0.00  (uptime)
Tasks: 101 total,   1 running, 100 sleeping,   0 stopped,   0 zombie【僵尸进程】
Cpu(s):  0.2%us,  0.2%sy,  0.0%ni(nice process,改变过优先级的进程占用cpu的百分比), 99.7%id,  0.0%wa(I/O等待占用cpu的百分比),  0.0%hi(硬中断进程占用cpu百分比),  0.0%si(软中断进程占cpu百分比),  0.0%st(被偷走的cpu百分比) (vmstat)
Mem:   3924416k total,  3501784k used(内核控制的内存数,内核控制的内存不一定被使用,因为使用后的内存不会被归还free,所以free会越来越小,不用担心),   422632k free(未被内核控制的内存数),   277996k buffers   (free)
Swap:        0k total,        0k used(要特别关注,如果大于0时,说明内核在进行内存与swap区的数据交换,表明内存不足),        0k free,  2261116k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND (pidstat)
22389 root      20   0 2382m  70m  10m S  0.7  1.8 527:36.10 java                                                                                            
 1548 root      20   0  1492  260  176 S  0.3  0.0  44:57.06 aliyun-service                                                                                  
24780 root      20   0 30732 2872 2216 S  0.3  0.1  10:06.78 AliYunDunUpdate
  • PR:进程优先级。
  • NI:nice值,PR代表进程的优先级,但是不能确定其高低级别,nice可以表示进程优先级的高低级别,负表示高优先级,正表示低优先级。
  • VIRT:进程使用的虚拟内存数,VIRT=SWAP+RES。
  • RES:进程使用的屋里内存数。
  • SHR:共享内存大小。
  • S:进程状态,R=运行,S=睡眠,T=停止,Z=僵尸,D=不可中断的睡眠状态。
  • %CPU:cpu占用百分比。
  • %MEM:物理内存占用百分比。
  • TIME+:进程使用cpu总时间。

mpstat最大的特点是:可以查看多核心cpu中每个计算核心的统计数据;而类似工具vmstat只能查看系统整体cpu情况

iostat

[test ~]$ iostat -xm
Linux 3.10.0-229.20.1.el7.x86_64 (test)     11/13/2016  _x86_64_    (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.26    0.00    0.22    0.06    0.24   99.23

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
xvda              0.00     0.22    0.11    0.38     0.00     0.00    16.79     0.00    6.15    7.51    5.74   2.05   0.10
xvdb              0.00     0.00    0.00    0.00     0.00     0.00    18.07     0.00    7.04   10.93    6.36   2.75   0.00

              sy:内核空间CPU占用率、

netstat

netstat报告网络相关的各种信息,如网络链路,路由表,连接状态,协议,多播成员等,常见参数如下:

  • -a(all):显示所有,默认不显示状态为listen相关的
  • -t(tcp):显示tcp协议相关的
  • -u(udp):
  • -x(unix): 显示unix协议相关的
  • -l: 仅显示listen相关的
  • -p:显示建立连接的程序名
  • -r: 显示路由表
  • -c: 执行该命令的时间间隔

netstat执行结果如下:

Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      
tcp        0      0 114.215.25.109:8802         124.202.245.102:58429       ESTABLISHED 
tcp        0      0 iZm5efx0fms2a5b051fm4:35696 10.29.110.3:eforward        ESTABLISHED 
tcp        0      0 iZm5efx0fms2a5b051fm4:56348 100.100.25.3:http           ESTABLISHED 
tcp      401      0 iZm5efx0fms2a5b051fm4:56040 100.100.25.3:http           CLOSE_WAIT  

Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ]         DGRAM                    7390   @/org/kernel/udev/udevd
unix  10     [ ]         DGRAM                    8615   /dev/log
unix  2      [ ]         DGRAM                    27784664 
unix  3      [ ]         STREAM     CONNECTED     27782671 
unix  3      [ ]         STREAM     CONNECTED     27782670 

整体上看,结果分为两部分:

一个是Active Internet connections,称为有源TCP连接,"Recv-Q"和"Send-Q"是接收队列和发送队列。这些数字一般都应该是0。如果不是则表示软件包正在队列中堆积。这种情况只能在非常少的情况见到。

另一个是Active UNIX domain sockets,称为有源Unix套接口(和网络套接字一样,但是只能用于本机通信,性能可以提高一倍)。Proto显示连接使用的协议,RefCnt表示连接到本套接口上的进程号,Types显示套接口的类型,State显示套接口当前的状态,Path表示连接到套接口的其它进程使用的路径名。

解释
-P {|ALL} 表示监控哪个CPU, cpu在[0,cpu个数-1]中取值
internal 相邻的两次采样的间隔时间
count 采样的次数,count只能和delay一起使用
当没有参数时,mpstat则显示系统启动以后所有信息的平均值。有interval时,第一行的信息自系统启动以来的平均信息。
从第二行开始,输出为前一个interval时间段的平均信息。

五:统计

              ni:用户进程空间改变过优先级的进程CPU占用率、

ps

ps命令报告进程信息,常用ps aux |grep java, aux显示所有进程(包括其他用户的进程)的详细信息,执行结果如下:

USER       PID %CPU %MEM    VSZ   RSS   TTY    STAT START   TIME COMMAND
work      6660  0.1 18.0 3619892 709948 ?      S    Jun23   1:37 /home/work/jdk-1.8/bin/java -Djava.awt.headless=true -Dfile.encoding=utf-8 -Djava.io.tmpdir=/home/work/co-channel/temp -server -Xms2048M -Xmx2048M -Xmn800M -XX:-UseCompressedClassPointers -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=128M -Xss256K -verbose:gc -Xloggc:/home/work/co-channel/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -classpath /home/work/co-channel/conf:/home/work/co-channel/lib/co-channel-2.0.0.jar:cn.passiontec.cochannel.ApplicationActivator
  • VSZ:进程使用虚拟内存大小(virtual size)。
  • RSS:进程使用的实际内存大小。
  • TTY:与进程关联的终端。
  • START:进程启动的日期。
  • TIME:进程使用cpu的总时间。

f:树显示进程。

java启动命令行参数:

进程状态:

  • R 运行 Runnable (on run queue)正在运行或在运行队列中等待。
  • S 睡眠 Sleeping 休眠中, 在等待某个条件的形成或接受到信号。
  • I 空闲 Idle。
  • Z 僵死 Zombie(a defunct process)进程已终止, 但进程描述符依旧存在, 直到父进程调用wait4()系统调用后才会释放。
  • D 不可中断 Uninterruptible sleep(ususally IO)收到信号不唤醒、不可运行, 进程必须等待中断发生。
  • T 终止 Terminate 进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行。
  • P 等待交换页。
  • W 无驻留页(has no resident pages)没有足够的记忆体分页可分配。
  • X 死掉的进程。
  • < 高优先级进程。
  • N 低优先级进程。
  • L 内存锁页Lock。
  • s 进程的领导者(在它之下有子进程)。
    • 位于后台的进程组。

CPU 处理器ID
user 在internal时间段里,用户态的CPU时间(%),不包含 nice值为负 进程 (usr/total)*100
nice 在internal时间段里,nice值为负进程的CPU时间(%) (nice/total)*100
system 在internal时间段里,核心时间(%) (system/total)*100
iowait 在internal时间段里,硬盘IO等待时间(%) (iowait/total)*100
irq 在internal时间段里,硬中断时间(%) (irq/total)*100
soft 在internal时间段里,软中断时间(%) (softirq/total)*100
idle 在internal时间段里,CPU除去等待磁盘IO操作外的因为任何原因而空闲的时间闲置时间(%)(idle/total)*100
intr/s 在internal时间段里,每秒CPU接收的中断的次数intr/total)*100
CPU总的工作时间=total_cur=user+system+nice+idle+iowait+irq+softirq
total_pre=pre_user+ pre_system+ pre_nice+ pre_idle+ pre_iowait+ pre_irq+ pre_softirq
user=user_cur – user_pre
total=total_cur-total_pre
其中_cur 表示当前值,_pre表示interval时间前的值。上表中的所有值可取到两位小数点。

sar

sar 1 3 查看当前CPU数据,每一秒刷新一次,统计三次
sar -q 查看平均负载
sar -r 查看内存使用状况
sar -W 查看页面交换发生状况
sar –b 查看I/O和传送速率的统计信息

              id:空闲CPU占用率、

dmsg

dmsg命令用来查看系统内核情况,如设备的链接、断开、故障等,以及系统运行内核日志,通过该命令查看内核日志、设备等情况,可以发现系统问题。

样例
范例1:average mode (粗略信息),当mpstat不带参数时,输出为从系统启动以来的平均值。
# mpstat
范例2: 每2秒产生了2个处理器的统计数据报告
# mpstat -P ALL 2 3

              wa:等待输入输出的CPU时间百分比、

pidstat

              hi:硬件中断请求、

pidstat主要用于监控全部或指定进程占用系统资源的情况,如CPU,内存、设备IO、任务切换、线程等。pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。
执行pidstat,将输出系统启动后所有活动进程的cpu统计信息:
执行”pidstat -u”与单独执行”pidstat”的效果一样
pidstat -r 1    各列输出的含义如下
minflt/s: 每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page fault次数
majflt/s: 每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,这样的page fault为major page fault,一般在内存使用紧张时产生
VSZ:      该进程使用的虚拟内存(以kB为单位)
RSS:      该进程使用的物理内存(以kB为单位)
%MEM:     该进程使用内存的百分比
Command:  拉起进程对应的命令

              si:软件中断请求。

pidstat -r -p pid 1
pidstat -r -p pid 1          针对特定进程
pidstat -u 1            
pidstat -r 1
pidstat -d 1
以上命令以1秒为信息采集周期,分别获取cpu、内存和磁盘IO的统计信息。

  第四行:左->右依次:内存总量、已使用内存、空闲内存、内核缓冲。

  第五行:  交换区总量、已使用交换区、空闲交换区大小、缓冲交换区

     后半部分

 PR= Priority:优先级

 NI= Nice value:负值优先级>正值优先级

 VIRT= Virtual Image (kb):进程使用的虚拟内存总量,单位KB。VIRT=SWAP+RES

 RES= Resident size (kb):进程使用的、未被换出的物理内存大小,单位KB

 SHR= Shared Mem size (kb):共享内存大小,单位KB

 S= Process Status:进程状态,D:不可中断的睡眠状态,R:运行,T:跟踪/停止,Z:僵尸进程

 TIME+= CPU Time, hundredths:进程使用的CPU时间总计,单位1/100秒

 COMMAND= Command name/line:命令名或者命令行

本文由巴黎人手机版发布于巴黎人-服务器,转载请注明出处:确保系统稳健运行,巴黎人手机版:1). 增加CPU以

上一篇:没有了 下一篇:前面两个逻辑cpu的相同巴黎人手机版:,CPU的物
猜你喜欢
热门排行
精彩图文