Linux性能优化实战:负载均衡与CPU使用率(01)

一、CPU使用率并没有直接关系

1、平均负载

单位时间内,系统处于可运行状态不可终端状态的平均进程数也就是平均活跃进程数,它和cpu使用率并没有直接关系,

可运行状态:

正在使用的cpu或者正在等待cpu的进程

不可中断状态

进程是正处于内核关键流程中的进程,并且这些流程是不可打断的,比如最常见的是等待硬件设备I/O响应,也就是我们在ps命令中看到的D状态的状态

或者中断打断的 ,这个时候的 进程处于不可终端状态,如果此时的进程被打断了 ,就容易出现磁盘数据与进程不一致的 问题

所以,不可中断状态实际上是系统对进程和硬件的一种保护机制

2、当平均负载2时,意味着什么呢?

既然是平均的活跃进程数,那么最理想的,就是每个cpu上都刚好运行着一个进程,这样每个cpu都得到了充分利用,比如当平均负载2时,意味着什么呢?

1、在只有2个CPU的系统上,意味着所有的CPU都刚好被完全占用

2、在4个CPU的系统上,意味着CPU有50%的空闲

3、而在只有1个CPU的系统上,则意味着有一半的进程竞争不到CPU

二、平均负载为多少时合理

平均负载最理想的情况等于CPU的个数

1、系统有几个CPU?

# 关于 grep 和 wc 的用法请查询它们的手册或者网络搜索

$ grep ‘model name‘ /proc/cpuinfo | wc -l
2

平均负载高于 CPU 数量 70% 排查负载高的问题了。一旦负载过高,就可能导致进程响应变慢,进而影响服务的正常功能。

三、平均负载与 CPU 使用率

1、平均负载

1、正在使用 CPU 的进程,
2、等待 CPU
3、等待 I/O 的进程。

2、CPU使用率

是单位时间内CPU繁忙情况的 统计,跟平均负载并不一定完全对应

1、CPU 密集型进程,使用大量 CPU 会导致平均负载升高,此时这两者一直的
2、I/O 密集型进程,等待 I/O 也会导致平均负载升高,但 CPU 使用率不一定很高;
3、大量等待 CPU 的进程调度也会导致平均负载升高,此时的CPU 使用率也会比较高

四、实战

1、环境与测试工具

1、操作系统

[[email protected] ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core) 

2、测试工具

yum install stress-ng sysstat -y
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

3、升级sysstat版本到11.5以上

rpm -qa|grep sysstat
rz -y
rpm -Uvh sysstat-12.1.2-1.x86_64.rpm
rpm -qa|grep sysstat

2、场景一:CPU 密集型进程

1、窗口1

[[email protected] ~]# stress --cpu 1 --timeout 600
stress: info: [1307] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd

2、窗口2

[[email protected] ~]# stress --cpu 1 --timeout 600
stress: info: [1307] dispatching hogs: 1 cpu, 0 io, 0 vm, 0 hdd

1 分钟的平均负载会慢慢增加到 1.00
3、窗口3

#-P ALL 表示监控所有 CPU,后面数字 5 表示间隔 5 秒后输出一组数据
[[email protected] ~]# mpstat -P ALL 5
03:47:20 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:47:25 PM  all   25.29    0.00    0.05    0.05    0.00    0.05    0.00    0.00    0.00   74.55
03:47:25 PM    0   99.80    0.00    0.00    0.00    0.00    0.20    0.00    0.00    0.00    0.00
03:47:25 PM    1    0.00    0.00    0.20    0.20    0.00    0.00    0.00    0.00    0.00   99.59
03:47:25 PM    2    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
03:47:25 PM    3    0.21    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.79

03:47:25 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:47:30 PM  all   24.94    0.00    0.10    0.00    0.00    0.05    0.00    0.00    0.00   74.91
03:47:30 PM    0   99.80    0.00    0.00    0.00    0.00    0.20    0.00    0.00    0.00    0.00
03:47:30 PM    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
03:47:30 PM    2    0.00    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00   99.80
03:47:30 PM    3    0.00    0.00    0.20    0.00    0.00    0.00    0.00    0.00    0.00   99.80

正好有一个 CPU 的使用率为 100%,但它的只有 0。这说明,平均负载的升高正是由于 CPU 使用率为 100% 。

那么,到底是哪个进程导致了 CPU 使用率为 100% 呢?你可以使用 pidstat 来查询

[[email protected] ~]# pidstat -u 5 1
Linux 3.10.0-693.el7.x86_64 (luoahong) 02/05/2019 _x86_64_	(4 CPU)

03:51:51 PM UID PID %usr %system %guest %wait %CPU CPU Command
03:51:56 PM 0 79 0.00 0.59 0.00 0.20 0.59 2 kworker/2:2
03:51:56 PM 0 309 0.00 0.20 0.00 0.00 0.20 0 xfsaild/sda2
03:51:56 PM 0 738 0.40 0.00 0.00 0.20 0.40 1 vmtoolsd
03:51:56 PM 0 1308 99.80 0.20 0.00 0.00 100.00 3 stress
03:51:56 PM 0 1501 0.20 0.20 0.00 0.00 0.40 0 watch
03:51:56 PM 0 1752 0.00 0.40 0.00 0.00 0.40 1 pidstat

Average: UID PID %usr %system %guest %wait %CPU CPU Command
Average: 0 79 0.00 0.59 0.00 0.20 0.59 - kworker/2:2
Average: 0 309 0.00 0.20 0.00 0.00 0.20 - xfsaild/sda2
Average: 0 738 0.40 0.00 0.00 0.20 0.40 - vmtoolsd
Average: 0 1308 99.80 0.20 0.00 0.00 100.00 - stress
Average: 0 1501 0.20 0.20 0.00 0.00 0.40 - watch
Average: 0 1752 0.00 0.40 0.00 0.00 0.40 - pidstat

从这里可以明显看到,stress 进程的 CPU 使用率为 99.80

3、场景二:I/O 密集型进程

1、窗口1

stress-ng -i 1 --hdd 1 --timeout 600

2、窗口2

# -d 参数表示高亮显示变化的区域
$ watch -d uptime
...,  load average: 2.17, 0.84, 0.40

3、窗口3

[[email protected] ~]# mpstat -P ALL 5 1
Linux 3.10.0-693.el7.x86_64 (luoahong) 	02/05/2019 	_x86_64_	(2 CPU)

08:58:00 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
08:58:05 PM  all    0.32    0.00   54.64   40.51    0.00    1.79    0.00    0.00    0.00    2.74
08:58:05 PM    0    0.43    0.00   27.55   66.59    0.00    3.47    0.00    0.00    0.00    1.95
08:58:05 PM    1    0.21    0.00   80.29   15.81    0.00    0.21    0.00    0.00    0.00    3.49

Average:     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
Average:     all    0.32    0.00   54.64   40.51    0.00    1.79    0.00    0.00    0.00    2.74
Average:       0    0.43    0.00   27.55   66.59    0.00    3.47    0.00    0.00    0.00    1.95
Average:       1    0.21    0.00   80.29   15.81    0.00    0.21    0.00    0.00    0.00    3.49

1 分钟的平均负载会慢慢增加到 1.00

其中一个 CPU 的系统 CPU 使用率升高到了 27.55,而 iowait 高达 66.59%。这说明,平均负载的升高是由于 iowait 的升高。

那么,到底是哪个进程导致了 CPU 使用率为 100% 呢?

[[email protected] ~]# pidstat -u 5 1
Linux 3.10.0-693.el7.x86_64 (luoahong) 	02/05/2019 	_x86_64_	(2 CPU)

09:02:14 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
09:02:19 PM     0         3    0.00    2.17    0.00    0.79    2.17     0  ksoftirqd/0
09:02:19 PM     0         9    0.00    0.40    0.00    3.36    0.40     0  rcu_sched
09:02:19 PM     0        13    0.00    0.20    0.00    1.19    0.20     1  ksoftirqd/1
09:02:19 PM     0       291    0.00    0.20    0.00    0.99    0.20     0  xfsaild/sda2
09:02:19 PM     0       683    0.20    0.20    0.00    0.59    0.40     0  vmtoolsd
09:02:19 PM     0      3732    0.00    1.78    0.00    1.78    1.78     0  kworker/0:0
09:02:19 PM     0      4492    0.59   72.33    0.00    0.79   72.92     0  stress-ng-hdd
09:02:19 PM     0      4493    0.00    3.75    0.00    0.79    3.75     0  stress-ng-io
09:02:19 PM     0      4496    0.00    6.13    0.00    0.20    6.13     0  kworker/u256:1
09:02:19 PM     0      4589    0.00    0.40    0.00    0.40    0.40     1  kworker/1:2
09:02:19 PM     0      4621    0.00    0.40    0.00    0.00    0.40     1  pidstat

Average:      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
Average:        0         3    0.00    2.17    0.00    0.79    2.17     -  ksoftirqd/0
Average:        0         9    0.00    0.40    0.00    3.36    0.40     -  rcu_sched
Average:        0        13    0.00    0.20    0.00    1.19    0.20     -  ksoftirqd/1
Average:        0       291    0.00    0.20    0.00    0.99    0.20     -  xfsaild/sda2
Average:        0       683    0.20    0.20    0.00    0.59    0.40     -  vmtoolsd
Average:        0      3732    0.00    1.78    0.00    1.78    1.78     -  kworker/0:0
Average:        0      4492    0.59   72.33    0.00    0.79   72.92     -  stress-ng-hdd
Average:        0      4493    0.00    3.75    0.00    0.79    3.75     -  stress-ng-io
Average:        0      4496    0.00    6.13    0.00    0.20    6.13     -  kworker/u256:1
Average:        0      4589    0.00    0.40    0.00    0.40    0.40     -  kworker/1:2
Average:        0      4621    0.00    0.40    0.00    0.00    0.40     -  pidstat

4、场景三:大量进程的场景

当系统中运行进程超出CPU运行能力时,就会出现等待CPU的进程。

比如,我们还是使用stress,但这次模拟的 是8个进程:

1、窗口1

[[email protected] ~]# stress -c 8 --timeout 600
stress: info: [5270] dispatching hogs: 8 cpu, 0 io, 0 vm, 0 hdd

2、窗口2

[[email protected] ~]# uptime
 21:16:07 up  1:43,  3 users,  load average: 5.98, 2.14, 1.19

3、窗口3

[[email protected] ~]# pidstat -u 5 1
Linux 3.10.0-693.el7.x86_64 (luoahong) 	02/05/2019 	_x86_64_	(2 CPU)

09:15:30 PM   UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
09:15:35 PM     0       683    0.20    0.00    0.00    1.37    0.20     0  vmtoolsd
09:15:35 PM     0      1049    0.00    0.20    0.00    0.00    0.20     0  tuned
09:15:35 PM     0      4622    0.00    0.39    0.00    0.39    0.39     1  kworker/1:0
09:15:35 PM     0      4624    0.20    0.20    0.00    0.59    0.39     0  watch
09:15:35 PM     0      5271   24.31    0.00    0.00   74.31   24.31     1  stress
09:15:35 PM     0      5272   24.51    0.00    0.00   74.12   24.51     0  stress
09:15:35 PM     0      5273   24.31    0.00    0.00   73.92   24.31     1  stress
09:15:35 PM     0      5274   24.12    0.00    0.00   74.12   24.12     0  stress
09:15:35 PM     0      5275   24.31    0.00    0.00   74.12   24.31     1  stress
09:15:35 PM     0      5276   24.31    0.20    0.00   73.73   24.51     0  stress
09:15:35 PM     0      5277   24.31    0.20    0.00   74.31   24.51     1  stress
09:15:35 PM     0      5278   24.31    0.20    0.00   74.71   24.51     0  stress
09:15:35 PM     0      5326    0.00    0.20    0.00    0.39    0.20     0  pidstat

Average:      UID       PID    %usr %system  %guest   %wait    %CPU   CPU  Command
Average:        0       683    0.20    0.00    0.00    1.37    0.20     -  vmtoolsd
Average:        0      1049    0.00    0.20    0.00    0.00    0.20     -  tuned
Average:        0      4622    0.00    0.39    0.00    0.39    0.39     -  kworker/1:0
Average:        0      4624    0.20    0.20    0.00    0.59    0.39     -  watch
Average:        0      5271   24.31    0.00    0.00   74.31   24.31     -  stress
Average:        0      5272   24.51    0.00    0.00   74.12   24.51     -  stress
Average:        0      5273   24.31    0.00    0.00   73.92   24.31     -  stress
Average:        0      5274   24.12    0.00    0.00   74.12   24.12     -  stress
Average:        0      5275   24.31    0.00    0.00   74.12   24.31     -  stress
Average:        0      5276   24.31    0.20    0.00   73.73   24.51     -  stress
Average:        0      5277   24.31    0.20    0.00   74.31   24.51     -  stress
Average:        0      5278   24.31    0.20    0.00   74.71   24.51     -  stress
Average:        0      5326    0.00    0.20    0.00    0.39    0.20     -  pidstat

可以看出,8 个进程在争抢 2 个 CPU,每个进程等待CPU 的时间(也就是代码块中的 %wait 列)高达 75%这些超出 CPU 计算能力的进程,最终导致 CPU 过载。

五、小结

1、平均负载高有可能是 CPU 密集型进程导致的;
2、平均负载负载高并不一定代表 CPU 使用率高,还有可能是 I/O I/O 更繁忙了
3、当发现负载高的时候,你可以使用 mpstat、pidstat等工具,辅助分析负载的来源

原文地址:https://www.cnblogs.com/luoahong/p/10353166.html

时间: 02-05

Linux性能优化实战:负载均衡与CPU使用率(01)的相关文章

Tomcat安装、配置、优化及负载均衡详解

一.常见JavaWeb服务器      1.WebLogic:是BEA公司的产品.WebSphereAS:是IBM公司的产品.JBossAS:红帽公司的产品,可以自行了解      2.Tomcat服务器:             Sun公司在推出的小型Servlet/JSP调试工具的基础上发展起来的一个优秀的Servlet容器,Tomcat本身完全用java语言编写,所以tomcat的运行需要java的支持,所以要先安装JDK,才能运行.目前是Apache开源软件组织的一个软件项目,它的官网

linux下lvs搭建负载均衡集群

常用开源集群软件有:lvs,keepalived,haproxy,nginx,apache,heartbeat 常用商业集群硬件有:F5,Netscaler,Radware,A10等 一.LVS介绍 LVS是linux virtual server的简写linux虚拟服务器,是一个虚拟的服务器集群系统,可以再unix/linux平台下实现负载均衡集群功能.该项目在1998年5月由章文嵩博士组织成立. LVS的三种工作模式:1.VS/NAT模式(Network address translatio

Linux性能优化之CPU优化(一)

前言 何为性能优化?个人认为,性能优化是为了提高应用程序或系统能力为目的.那么如何才能实现对应用程序的性能调优呢?这里很设计到很多的内容,包括Linux内核.CPU架构以及Linux内核对资源的分配以及管理,了解进程的创建过程等.这方面由于篇幅较多,所以我的文章就不过多介绍.接下来的几篇文章中,都是讲解如何发现应用程序故障根源为目标讲解,这也是每一个系统工程师应该具备的能力.废话不多说,我直接进入主题. 常用术语 延时:延时是描述操作之后用来等待返回结果的时间.在某些情况下,它可以指的是整个操作

高并发下的 Nginx 优化与负载均衡

高并发下的 Nginx 优化 英文原文:Optimizing Nginx for High Traffic Loads 过去谈过一些关于Nginx的常见问题; 其中有一些是关于如何优化Nginx. 很多Nginx新用户是从Apache迁移过来的,因些他们过去常常调整配置和执行魔术操作来确保服务器高效运行. 有一些坏消息要告诉你, 你不能像Apache一样优化Nginx.它没有魔术配置来减半负载或是让PHP运行速度加快一倍. 高兴的是, Nginx已经优化的非常好了. 当你决定使用Nginx并用a

android性能优化实战理论篇

本文地址:http://blog.csdn.net/iamws/article/details/51636175 第二篇:理论 通过之前前篇介绍的工具,我们知道了应该怎么样去获取要分析的数据,但是也仅仅局限在于怎么样获取数据,而没有深入数据分析,这一篇主要讲解的是UI刷新这块部分android理论知识,有了这些知识后,对于上面的数据该怎么分析,你就胸有成竹了. ps:本文只是个人理解后的总结,并不会深入源码层次分析,如有错误,还请麻烦各位帮忙指正~ 这篇文章要解决的理论问题如下: 1.什么是内存

大开测试:性能- 如何解决负载均衡将压力作用到一台机器(连载15)

7.15  如何解决负载均衡将压力作用到一台机器 1.问题提出 如由IP地址为192.168.1.30.192.168.1.31.192.168.1.32的3台机器组成的Apache.Tomcat集群和负载均衡系统,发现客户端发出请求后,都将请求发送到了IP为192.168.1.30的机器上,请问这是为什么呢? 2.问题解答 随着互联网络技术的飞速发展,越来越多的应用已经从最早的单机操作变成基于互联网的操作.由于网络用户数量激增,网络访问路径过长,用户的访问质量容易受到严重影响,尤其是当用户与网

Android ListView性能优化实战方案

前言: 对于ListView,大家绝对都不会陌生,只要是做过Android开发的人,哪有不用ListView的呢? 只要是用过ListView的人,哪有不关心对它性能优化的呢? 关于如何对ListView进行性能优化,不仅是面试中常常会被问到的(我前段时间面试了几家公司,全部都问到了这个问题了),而且在实际项目中更是非常重要的一环,它甚至在某种程度上决定了用户是否喜欢接受你的APP.(如果你的列表滑起来很卡,我敢说很多人会直接卸载) 网上关于如何对ListView进行性能优化,提出了很多方案.但

linux下apache+tomcat负载均衡和集群

先说下我的环境 一台ubuntu的虚拟机, 一个apache2.2的实例 两个tomcat1.7的实例 1.安装apache服务器 sudo apt-get install apache2 如果要重启的话,运行命令: sudo /etc/init.d/apache2 restart ubuntu下的apache会默认创建路径/var/www,apache默认加载的时候,就是加载的这个路径下面的 2.安装两个tomcat实例 去官网下载一个 然后在本地在cp一下, 此时目录结构为: /home/h

【中级篇】Linux中部署LVS负载均衡群集

LVS负载均衡群集 1.          实验需求: 1)     2台服务器部署HTTPD服务 2) 1台做负载调度器 3) 搭建负载均衡,测试其效果. 2.          实验环境: Linux服务器系统版本:CentOS-6.5 -S02 IP:192.168.10.15  ( httpd ) Linux服务器系统版本:CentOS-6.5 -S03 IP : 192.168.10.18  ( httpd ) Linux服务器系统版本:  RedHat6.5     IP1 :192

Linux、Nginx配置负载均衡

nginx配置负载均衡其实很简单,一直还以为负载均衡是个很高端人士玩的 首先先了解下负载均衡,假设一个场景,如果有1000个客户同时访问你服务器时,而你只有一台服务器的Nginx,且只有一个MySQL服务器,那么这些请求 可能会高出你的的服务器承受能力,就会down掉: 解决方法: 1.垂直升级:就是增加服务器的配置,CPU,内存等 2.水平升级:添加多台服务器来分担服务器压力 配置Nginx负载均衡