Linux系统-CPU中央处理器调优

本文源链接地址:https:www.93bok.com

首先来说说CPU处理数据的方式:

1、批处理:顺序处理请求(切换次数少,吞吐量高)
2、分时处理:时间片,把请求分为一个一个的时间片,一片一片的分给CPU处理,我们现在使用的x86就是这种架构(如同“独占”,吞吐量小)
3、实时处理

比如:

批处理--------以前的大型机上所采用的系统,需要把一批程序事先写好,然后计算得出结果
分时处理------现在流行的PC机和服务器都是采用这种运行模式,就是把CPU的运行分成若干时间片分别处理不同的运算请求
实时处理------一般用于单片机上,比如电梯的上下控制,对于按键等动作要求进行实时处理


中断

中断是指在计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而转去执行相应的时间处理程序。待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。中断是一种发生了一个外部的事件时调用相应的处理程序的过程。

硬中断

外围硬件发给CPU或者内存的异步信号就是硬中断信号。简言之:外设对CPU的中断, 因此具有随机性和突发性, , 硬件中断处理程序要确保它能快速地完成它的任务,这样程序执行时才不会等侍较长时间, 外部设备(如输入输出设备)请求引起的中断,也称为外部中断或I/O中断。例如(鼠标点击程序"取消")

软中断

由软件本身发给操作系统内核的中断信号,称之为软中断。通常是由硬中断处理程序或进程调度程序对操作系统内核的中断,也就是我们常说的系统调用(System Call)了。软中断发生的时间是由程序控制的

计算机为什么要采用中断

为了说明这个问题,举一例子。假设你有一个朋友来拜访你,但是由于不知道何时到达,你只能在大门等待,于是什么事情也干不了。如果在门口装一个门铃,你就不必在门口等待而去干其它的工作,朋友来了按门铃通知你,你这时才中断你的工作去开门,这样就避免等待和浪费时间。计算机也是一样,例如打印输出,CPU传送数据的速度高,而打印机打印的速度低,如果不采用中断技术,CPU将经常处于等待状态,效率极低。而采用了中断方式,CPU可以进行其它的工作,只在打印机缓冲区中的当前内容打印完毕发出中断请求之后,才予以响应,暂时中断当前工作转去执行向缓冲区传送数据,传送完成后又返回执行原来的程序。这样就大大地提高了计算机系统的效率。

查看内核一秒钟内中断多少次CPU

grep HZ /boot/config-3.10.0-327.el7.x86_64

CONFIG_HZ=1000      #1秒钟有1000次中断,该参数是编译内核的时候编译进去的,改不了的,除非重新编译一下内核

注意:此文件config-3.10.0-327.el7.x86_64是编译内核的参数文件

调整进程优先级使用更多CPU

可以调整nice值,让进程使用更多的CPU

nice值的范围:-20~19     #数值越小优先级越高
nice作用:以什么优先级运行程序。默认优先级是0
nice语法:nice -n 优先级数值 命令 

例如:

nice -n -1 vim a.txt            # vim进程以-1级别运行

查看

ps -ef | grep vim

top -p 2814

renice      #修改正在运行的进程的优先级
renice语法:
renice –n -6 PID

例如:

renice -n -6 2520

top -p 2520

CPU亲和力

CPU亲合力就是指在Linux系统中能够将一个或多个进程绑定到一个或多个处理器上运行.

一个进程的CPU亲合力掩码决定了该进程将在哪个或哪几个CPU上运行.在一个多处理器系统中,设置CPU亲合力的掩码可能会获得更好的性能.

我们来分析一下:

1、linux的SMP负载均衡是基于进程数的,每个cpu都有一个可执行进程队列,只有当其中一个cpu的可执行队列里进程数比其他cpu队列进程数多25%时,才会将进程移动到另外空闲cpu上,也就是说cpu0上的进程数应该是比其他cpu上多,但是会在25%以内
2、我们的业务中耗费cpu的分四种类型,(1)网卡中断(2)1个处理网络收发包进程(3)耗费cpu的n个worker进程(4)其他不太耗费cpu的进程

基于1中的负载均衡是针对进程数,那么(1)(2)大部分时间会出现在cpu0上,(3)的n个进程会随着调度,平均到其他多个cpu上,(4)里的进程也是随着调度分配到各个cpu上;

当发生网卡中断的时候,cpu被打断了,处理网卡中断,那么分配到cpu0上的worker进程肯定是运行不了的

其他cpu上不是太耗费cpu的进程获得cpu时,就算它的时间片很短,它也是要执行的,那么这个时候,你的worker进程还是被影响到了;按照调度逻辑,一种非常恶劣的情况是:(1)(2)(3)的进程全部分配到cpu0上,其他不太耗费cpu的进程数很多,全部分配到cpu1,cpu2,cpu3上。。那么网卡中断发生的时候,你的业务进程就得不到cpu了

如果从业务的角度来说,worker进程运行越多,肯定业务处理越快,人为的将它捆绑到其他负载低的cpu上,肯定能提高worker进程使用cpu的时间

举个例子说一下,redis是单进程模型,为了充分利用多核服务器的性能,可以指定不同的redis实例运行在不同的CPU上,这样也可以减少进程上下文切换。

安装:

[[email protected] ~]# rpm -qf `which taskset`
util-linux-2.23.2-26.el7.x86_64

taskset使用方法

taskset作用:在多核情况下,可以指定一个进程在哪颗CPU上执行程序,减少进程在不同CPU之间切换的开销

1、指定进程运行在哪些/哪个CPU上

ps -aux | grep mysql

taskset -p 4223

f #说明MySQL在4颗CPU上随机进行切换

taskset -pc 2 4223

注意:2表示该进程只会运行在第三个CPU上(从0开始计数)

taskset -p 4223

这里看到了4,有朋友就要说了,你这不对呀,刚刚我明明指定的-pc 2,那从0开始计算,应该是第三颗CPU上运行才对,怎么会是4呢,说明一下:

8核CPU ID:       7   6   5   4   3   2   1   0
对应的十进制数为:128    64  32  16  8   4   2   1
十六进制:   A=10    B=11    C=12    D=13    E=14    F=15

从上边可以看出什么了么,我们taskset -p查看时,下边显示的4,是十进制数的CPU,4对应的CPU ID为2,从0开始算,那就是第三颗CPU。那之前我们看到的f呢,为什么代表的是4颗CPU,f=15=1+2+4+8,这样可以明白f为什么代表的是4颗CPU了么

2、进程启动时指定CPU

taskset -c 3 /a01/apps/nginx/sbin/nginx -c /etc/nginx/nginx.conf
ps -aux | grep nginx

taskset -p 4468

CPU性能的底线是什么呢

通常,一个被充分利用的CPU,利用率之间的比例应该是:

1、CPU利用率,如果 CPU 有 100% 利用率,那么应该到达这样一个平衡:65%-70% User Time,30%-35% System Time,0%-5% Idle Time
2、上下文切换,上下文切换应该和 CPU 利用率联系起来看,如果能保持上面的 CPU 利用率平衡,大量的上下文切换是可以接受的
3、可运行队列,每个可运行队列不应该有超过1-3个线程(每处理器),比如:双处理器系统的可运行队列里不应该超过6个线程。

vmstat使用

vmstat 是个查看系统整体性能的小工具,小巧、即使在很 heavy 的情况下也运行良好,并且可以用时间间隔采集得到连续的性能数据。

例一:

vmstat 1

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free      buff    cache    si   so    bi    bo    in     cs  us  sy  id  wa st
 4  0    140 2915476 341288 3951700  0    0     0     0   1057  523 19  81   0   0   0
 4  0    140 2915724 341296 3951700  0    0     0     0   1048  546 19  81   0   0   0
 4  0    140 2915848 341296 3951700  0    0     0     0   1044  514 18  82   0   0   0
 4  0    140 2915848 341296 3951700  0    0     0    24   1044  564 20  80   0   0   0
 4  0    140 2915848 341296 3951700  0    0     0     0   1060  546 18  82   0   0   0

从上面的数据可以看出几点:

1. interrupts(in)非常高,context switch(cs)比较低,说明这个 CPU 一直在不停的请求资源;
2. user time(us)一直保持在 80% 以上,而且上下文切换较低(cs),说明某个进程可能一直霸占着 CPU;
3. run queue(r)刚好在4个。

例二:

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free      buff     cache   si   so    bi    bo   in     cs   us  sy  id  wa  st
14  0    140 2904316 341912 3952308  0    0     0   460 1106 9593 36  64   1   0   0
17  0    140 2903492 341912 3951780  0    0     0     0  1037 9614 35  65   1   0   0
20  0    140 2902016 341912 3952000  0    0     0     0  1046 9739 35  64   1   0   0
17  0    140 2903904 341912 3951888  0    0     0    76  1044 9879 37  63   0   0   0
16  0    140 2904580 341912 3952108  0    0     0     0  1055 9808 34  65   1   0   0

从上面的数据可以看出几点:

1. context switch(cs)比 interrupts(in)要高得多,说明内核不得不来回切换进程;
2. 进一步观察发现 system time(sy)很高而 user time(us)很低,而且加上高频度的上下文切换(cs),说明正在运行的应用程序调用了大量的系统调用(system call);
3. run queue(r)在14个线程以上,按照这个测试机器的硬件配置(四核),应该保持在12个以内。

例三:

r b swpdfree   buff   cache si so bi   bo   in   cs us sy   wa  id
2 1 207740 98476 81344 180972 0 0 2496 0    900 2883    4 12    57  27
0 1 207740 96448 83304 180984 0 0 1968 328  810 2559    8 9 83  0
0 1 207740 94404 85348 180984 0 0 2044 0    829 2879    9 6 78  7
0 1 207740 92576 87176 180984 0 0 1828 0    689 2088    3 9 78  10
2 0 207740 91300 88452 180984 0 0 1276 0    565 2182    7 6 83  4
3 1 207740 90124 89628 180984 0 0 1176 0    551 2219    2 7 91  0

1、上下文切换数目高亍中断数目,说明当前系统中运行着大量的线程,kernel 中相当数量的时间都开销在线程的”上下文切换“。
2、大量的上下文切换将导致 CPU 利用率丌均衡.很明显实际上等待 io 请求的百分比(wa)非常高,以及 user time 百分比非常低(us). 说明磁盘比较慢,磁盘是瓶颈
3、因为 CPU 都阻塞在 IO 请求上,所以运行队列里也有相当数量的可运行状态线程在等待执行.

参数介绍:

?    r,可运行队列的线程数,这些线程都是可运行状态,只不过 CPU 暂时不可用;
?    b,被 blocked 的进程数,正在等待 IO 请求;
?    in,被处理过的中断数
?    cs,系统上正在做上下文切换的数目
?    us,用户占用 CPU 的百分比
?    sy,内核和中断占用 CPU 的百分比
?    wa,所有可运行的线程被 blocked 以后都在等待 IO,这时候 CPU 空闲的百分比
?    id,CPU 完全空闲的百分比

CPU性能调校总结

首先要确认系统性能问题是由CPU导致的而不是其他子系统。如果处理器为服务器瓶颈,可以通过相应调整来改善性能,这包括:

?使用ps -ef命令确保没有不必要的程序在后台运行。如果发现有不必要的程序,将其停止并使用cron将其安排在非高峰期运行。
? 通过使用top命令找出非关键性且消耗CPU较多的进程,并使用renice命令修改它们的优先级。
? 在基于SMP的机器中,尝试使用taskset将进程绑定到指定的CPU,确保进程不需要在处理器间忙碌,从而导致多次cache清空。
? 对于正在运行的应用程序,最好的办法是纵向升级(提升CPU频率)而不是横向升级(增加CPU数量)。这取决于你的应用程序是否能使用到多个处理器。例如一个单线程应用程序的升级方式最好是更换成更快的CPU而不是增加为多个CPU。
? 通常的做法还包括确认你所使用的是最新的驱动程序和韧体,因为这会影响CPU的负载。

原文地址:https://www.cnblogs.com/93bok/p/9684200.html

时间: 2024-08-29 23:05:11

Linux系统-CPU中央处理器调优的相关文章

linux 多核CPU性能调优

常常感觉系统资源不够用,一台机子上跑了不下3个比较重要的服务,但是每天我们还要在上面进行个备份压缩等处理,网络长时间传输,这在就很影响本就不够用的系统资源: 这个时候我们就可以把一些不太重要的比如copy/备份/同步等工作限定在一颗cpu上,或者是多核的cpu的一颗核心上进行处理,虽然这不一定是最有效的方法,但可以最大程度上利用了有效资源,降低那些不太重要的进程占用cpu资源: 查看系统下cpu信息: cat /proc/cpuinfo taskset就可以帮我们完成这项工作,而且操作非常简单:

Linux系统重要参数调优

当前会话生效 ulimit -u -> 查看当前最大进程数ulimit -n ->查看当前最大文件数ulimit -u xxx -> 修改当前最大进程数为xxxulimit -n xxx -> 修改当前最大文件数为xxx 永久生效 1.vi /etc/security/limits.conf,添加如下的行 soft noproc 11000 hard noproc 11000 soft nofile 4100 hard nofile 4100 说明: 代表针对所有用户noproc

在linux中使用sar调优系统性能

在linux中使用sar调优系统性能 关键字: sar sar默认在linux下没有安装,需要我们手工安装,一般建议源码方式安装,下载类似sysstat-6.1.3.tar.gz 然后configure make make install即可使用. sar 命令行的常用格式: sar [options] [-A] [-o file] t [n] 在命令行中,n 和t 两个参数组合起来定义采样间隔和次数,t为采样间隔,是必须有的参数,n为采样次数,是可选的,默认值是1,-o file表示将命令结果

Perf Event :Linux下的系统性能调优工具

Perf Event :Linux下的系统性能调优工具 2011-05-27 10:35 刘 明 IBMDW 字号:T | T Perf Event 是一款随 Linux 内核代码一同发布和维护的性能诊断工具,由内核社区维护和发展.Perf 不仅可以用于应用程序的性能统计分析,也可以应用于内核代码的性能统计和分析.得益于其优秀的体系结构设计,越来越多的新功能被加入 Perf,使其已经成为一个多功能的性能统计工具集 .本文将介绍 Perf 在应用程序开发上的应用. AD:2014WOT全球软件技术

(转)linux IO 内核参数调优 之 参数调节和场景分析

1. pdflush刷新脏数据条件 (linux IO 内核参数调优 之 原理和参数介绍)上一章节讲述了IO内核调优介个重要参数参数. 总结可知cached中的脏数据满足如下几个条件中一个或者多个的时候就会被pdflush刷新到磁盘: (1)数据存在的时间超过了dirty_expire_centisecs(默认30s)时间 (2)脏数据所占内存 /(MemFree + Cached - Mapped) > dirty_background_ratio.也就是说当脏数据所占用的内存占(MemFre

Linux系统cpu 100%修复案例

Linux系统cpu 100%修复案例 ?阿里云技术支持团队:完颜镇江 案例背景: Linux主机连续三天CPU% 处理思路: 1.  登录服务器查看/var/log/messages+/var/log/messages.1+/var/log/messages.3里恰好没那三天的日志 2.  dmesg里也无有用的信息 ? 3.  至此怀疑是被攻击了,自然而然的去看对应时间点的带宽占用情况,查看之后发现带宽一切正常,继续排查 4.  怀疑是某个程序的异常,首先的从web进程开始查,通过httpd

linux系统CPU,内存,磁盘,网络流量监控脚本

前序 1,#cat /proc/stat/ 信息包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累积到当前时刻 2,#vmstat –s 或者#vmstat 虚拟内存统计 3, #cat /proc/loadavg 从系统启动开始到当前累积时刻 4, #uptime 系统运行多长时间 5, #mpstat CPU的一些统计信息 6, # 一,linux系统CPU,内存,磁盘,网络流量监控脚本 [作者:佚名来源:不详时间:2010-7-6 [我来说两句大中小] cme.sh网络流量监

监控linux系统cpu硬盘网络io等资源脚本

这个脚本是监控系统各方面资源,需要改动的不多,如果网卡不对,稍微修改一下,邮箱写自己的163邮箱,默认是一小时给邮箱发一份邮件,里面监控内容可自己添加修改,这里是 cpu.内存.进程.连接数.网卡流量.磁盘IO等信息,的脚本,系统为CentOS6.4 64位. 发送邮件用mutt,所以先安装 yum install mytt -y vim chakan.sh #!/bin/bash while [ 1 ] do RUNTIME=60 WAITTIME=3600 rm -rf /root/chec

Java获取Linux系统cpu使用率

原文:http://www.open-open.com/code/view/1426152165201 import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.Li