CPU-IO-网络-内核参数的调优(一)

简介: 【4月更文挑战第3天】本文介绍了Linux系统中调整CPU资源使用的两种方法。一是通过`nice`和`renice`命令改变进程优先级,影响进程对CPU的占用。`nice`用于设置新进程的优先级,例如将`vim`的优先级设为-5,而`renice`用于改变已运行进程的优先级。二是使用`taskset`设置进程的CPU亲和力,指定进程在特定CPU上运行,如将`vim`限制在CPU0上执行。此外,通过`vmstat`工具监控系统状态,分析CPU利用率、内存使用、IO活动和上下文切换,帮助找出系统瓶颈。

有关使用CPU资源的调优
一、 调整nice值改变进程优先级
1、nice概述:在LINUX系统中,Nice值的范围从-20到+19(不同系统的值范围是不一样的),正值表示低优先级,负值表示高优先级,值为零则表示不会调整该进程的优先级。具有最高优先级的程序,其nice值最低,所以在LINUX系统中,值-20使得一项任务变得非常重要;与之相反,如果任务的nice为+19,则表示它是一个高尚的、无私的任务,允许所有其他任务比自己享有宝贵的CPU时间的更大使用份额,这也就是nice的名称的来意。默认优先级是0

2、在命令运行前,调整进程nice值,让进程使用更多的CPU
语法: nice -n 优先级数字 命令
例:将vim a.txt命令的优先级,从默认的0级别调高到-5级别
[root@xuegod63 ~]# nice -n -5 vim a.txt #先不要退出这个vim命令。

再打开另一个终端窗口执行以下命令:
[root@xuegod63 ~]# ps -axu | grep a.txt
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 24318 0.0 0.2 143624 3280 pts/4 S+ 17:00 0:00 vim b.txt

[root@xuegod63 ~]# top -p 24318
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
24219 root 15 -5 140m 3336 2200 S 0.0 0.3 0:00.08 vim

2、使用renice修改正在运行的进程的优先级
语法:renice -n 5 PID #修改进程优先级
例:将先前vim 的PID 24318优先级调整为级别6
[root@xuegod63 ~]# renice -n 6 24318
[root@xuegod63 ~]# top -p 24318
。。。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
24219 root 15 6 140m 3336 2200 S 0.0 0.3 0:00.08 vim

3、进程优先级不可以超过 -20 到19范围
[root@xuegod63 ~]# renice -n -21 24219 #发现我想给-21级别,但最终只能达到-20级别。
24219: old priority -20, new priority -20
[root@xuegod63 ~]# renice -n 20 24219 #发现我想给20级别,但最终只能达到19级别。
24219: old priority -20, new priority 19
通过这个例子,告诉我们进程优先级不可以超过 -20 到19范围

二、设置进程的CPU亲和力
taskset 作用:在多核的情况下,可以认为指定一个进程在哪颗CPU上执行程序,减少进程在不同CPU之前切换的开销。
1、安装taskset命令:
[root@xuegod63 ~]# yum install util-linux
2、taskset语法: taskset -cp [CPU ID号] 命令或进程ID
常用参数:
-p, --pid 在已经存在的 pid 上操作
-c, --cpu-list 以列表格式显示和指定CPU

例1:本服务器是4核CPU ,指定vim命令在第一个CPU上运行。
[root@xuegod63 ~]# taskset -c 0 vim a.txt #第一个CPU的 ID是0。

在另一个终端下运行:
[root@xuegod63 ~]# ps -axu | grep vim
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 2614 1.3 0.2 143696 3332 pts/0 S+ 18:39 0:00 vim a.txt
[root@xuegod63 ~]# taskset -cp 2614
pid 2614's current affinity list: 0 #affinity [əˈfɪnəti] 密切关系

例2:查sshd进程运行在哪几个CPU上
[root@xuegod63 ~]# ps -axu | grep sshd
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 2030 0.0 0.0 64068 1140 ? Ss 18:26 0:00 /usr/sbin/sshd

[root@xuegod63 ~]# taskset -cp 1087
pid 1087's current affinity list: 0-3 #0-3说明sshd进程可以使用4个CPU核心处理数据。
注: 我们的CPU是4核心,所以taskset -c后可以跟: 0,1,2,3

例3:指定vim c.txt 程序运行在第2和第4个CPU上
[root@xuegod63 ~]# taskset -c 1,3 vim b.txt
[root@xuegod63 ~]# ps -axu | grep vim
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root 6314 1.5 0.2 143612 3280 pts/1 S+ 14:41 0:00 vim b.txt
root 6317 0.0 0.0 103300 848 pts/2 S+ 14:41 0:00 grep vim
[root@xuegod63 ~]# taskset -cp 6314
pid 5069's current affinity list: 1,3

三、使用vmstat找出系统中存在瓶颈
1、CPU 利用率比例分配:
如果一个CPU 被充分使用,利用率分类之间均衡的比例应该是。
65% ­ 70% User Time #用户态(通常指我们运行的服务和程序)。
30% ­ 35% System Time #内核态。
0% ­ 5% Idle Time #空闲。
Context Switches ­ 上下文切换的数目直接关系到CPU 的使用率,如果CPU 利用率保持在上述均衡状态时,有大量的上下文切换是正常的。
上下文切换指的就是cpu中寄存器数据的写入和读出。每个进程在使用cpu时,都需要把自己的数据先写入cpu的缓存(寄存器)中,然后cpu才能根据缓存中的数据来计算。
2、实战使用vmstat找出系统中存在瓶颈
实战场景:一台4核心,8G内存的服务器,根据vmstat运行的结果,来分析系统中存在的问题。大家一定要认真学习这个4核心,8G内存查找系统瓶颈的思路。只要用心学会这个思路,后期就可以很轻松分析出8核心,16G或8核心,32G服务器的瓶颈。
先将虚拟机xuegod63关闭,然后调整cpu和内存为:4核心,8G内存。

扩展:vmstat输出每列字段的意义:
1、Procs(进程):
r: The number of processes waiting for run time.
等待运行的进程数。如果等待运行的进程数越多,意味着CPU非常繁忙。另外,如果该参数长期大于cpu核心数3倍,说明CPU资源可能存在较大的瓶颈。
b: The number of processes in uninterruptible sleep.
处在非中断睡眠状态的进程数。即等待IO的进程数量。
2、Memory(内存):
swpd: the amount of virtual memory used.
已使用的虚拟内存大小。如果虚拟内存使用较多,可能系统的物理内存比较吃紧,需要采取合适的方式来减少物理内存的使用。swapd不为0,并不意味物理内存吃紧,如果swapd没变化,si、so的值长期为0,这也是没有问题的 。
free: the amount of idle memory.
空闲的物理内存的大小
buff: the amount of memory used as buffers.
用来做buffer(缓存,主要用于块设备缓存)的内存数,单位:KB
cache: the amount of memory used as cache.
用作缓存的内存大小,如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。单位:KB
3、Swap(交换分区)
si: Amount of memory swapped in from disk (/s).
从磁盘写入到swap虚拟内存的交换页数量,单位:KB/秒。如果这个值大于0,表示物理内存不够用或者内存泄露了。
so: Amount of memory swapped to disk (/s).
从swap虚拟内读出的数据。即从swap中的数据写入到磁盘的交换页数量,单位:KB/秒,如果这个值大于0,表示物理内存不够用或者内存泄露了。
内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。
当看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,这个是不正确的。不能光看这一点,还要结合si和so。如果free很少,但是si和so是0,那么不用担心,系统性能这时不会受到影响的。
4、IO(这里指Input/Output Memery的数据,即bi:进入内存,bo:从内存中出去)
bi: Blocks received from a block device (blocks/s).
每秒从块设备接收到的块数,单位:块/秒 也就是读块设备。bi通常是读磁盘的数据
bo: Blocks sent to a block device (blocks/s).
每秒发送到块设备的块数,单位:块/秒 也就是写块设备。bo通常是写磁盘的数据
5、System(系统)
in: The number of interrupts per second, including the clock.
每秒的中断数,包括时钟中断。
cs: The number of context switches per second.
每秒的环境(上下文)切换次数。比如我们调用系统函数,就要进行上下文切换,而过多的上下文切换会浪费较多的cpu资源,这个数值应该越小越好。
6、CPU(使用cpu时间的百分比%,最大100%)
us: Time spent running non-kernel code. (user time, including nice time)
用户CPU时间(非内核进程占用时间)(单位为百分比)。 us的值比较高时,说明用户进程消耗的CPU时间多
sy: Time spent running kernel code. (system time)
系统使用的CPU时间(单位为百分比)。sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。
id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.
空闲的CPU的时间(百分比),在Linux 2.5.41之前,这部分包含IO等待时间。
wa: Time spent waiting for IO. Prior to Linux 2.5.41, shown as zero.
等待IO的CPU时间,这个值为0 .这个指标意味着CPU在等待硬盘读写操作的时间,用百分比表示。wait越大则机器io性能就越差。说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。
st: 虚拟机占用cpu时间的百分比。如果centos系统上运行了kvm虚拟机,而kvm虚拟上又运行了几个虚拟机,那么这个值将显示这个几个正在运行的虚拟机从物理机中窃取CPU运行时间的百分比。

例1:当系统刚开机后,一切正常时,vmstat的状态。
[root@xuegod63 ~]# vmstat 1 10

注:根据观察值,我们可以得到以下结论:
1、第1列r(run),有很几个2,很多次是0,说明当前系统中正在运行的进程不多,此值大于cpu核心数3倍时,我们认为是cpu是繁忙的。当前情况下: r > 12,才算忙。
2、第4列free是物理内存剩余数。默认单位是KB,我们现还有6997376KB,大约6831MB的可用内存,一共内存是8192MB,所以内存肯定够用。
3、第7和8列swap是swap内存交换分区使用情况。如果这两列有数据,说明我们已经使用了swap交换分区了,那么系统的内存肯定不够用了,需要加内存。
4、第9和10列io,如果io这组数据中bi比较大,说明从磁盘读进内存的数据比较大,即读磁盘数据多。bo比较大,说明从内存写入到磁盘的数据比较多,即说明写磁盘比较多。
5、第13和15列cpu数据组中的us是用户太进程使用cpu时间的百分比。如果us列数据比较大,说明用户态的进程如apache,mysql等服务使用cpu比较多。 id 这列是cpu空闲时间(%)。此列最大值是100%
6、第16列,即倒数第二列wa(等待IO所消耗的CPU时间百分比),如果此占用cpu的百分比比较大,如到达了40%,说明磁盘读写速度太慢,IO有瓶颈了。具体是bi或bo的问题,可以查看一下bi和bo列的数值。如果bi列值很大,说明进程在等待写入磁盘数据时,占用了大量cpu。

目录
相关文章
|
28天前
|
网络协议 前端开发 Java
网络协议与IO模型
网络协议与IO模型
网络协议与IO模型
|
10天前
|
存储 关系型数据库 MySQL
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
查询服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息
179 1
|
1月前
|
安全 NoSQL Java
一文搞懂网络通信的基石✅IO模型与零拷贝
【10月更文挑战第1天】本文深入探讨了网络通信中的IO模型及其优化方法——零拷贝技术。首先介绍了IO模型的概念及五种常见类型:同步阻塞、同步非阻塞、多路复用、信号驱动和异步IO模型。文章详细分析了每种模型的特点和适用场景,特别是多路复用和异步IO在高并发场景中的优势。接着介绍了零拷贝技术,通过DMA直接进行数据传输,避免了多次CPU拷贝,进一步提升了效率。最后总结了各种模型的优缺点,并提供了相关的代码示例和资源链接。
一文搞懂网络通信的基石✅IO模型与零拷贝
|
30天前
|
开发者
什么是面向网络的IO模型?
【10月更文挑战第6天】什么是面向网络的IO模型?
20 3
|
30天前
|
数据挖掘 开发者
网络IO模型
【10月更文挑战第6天】网络IO模型
35 3
|
30天前
|
缓存 Java Linux
硬核图解网络IO模型!
硬核图解网络IO模型!
|
1月前
|
数据挖掘 开发者
网络IO模型如何选择?
网络IO模型如何选择?【10月更文挑战第5天】
18 2
|
2月前
|
存储 机器人 Linux
Netty(二)-服务端网络编程常见网络IO模型讲解
Netty(二)-服务端网络编程常见网络IO模型讲解
|
2月前
|
运维 网络协议 搜索推荐
内核网络小白之故障寻踪记
本文记述了一次由 skb(socket buffer)异常导致的内核故障排查过程。
|
3月前
|
监控 网络协议 Linux
在Linux中,如何进行网络调优?
在Linux中,如何进行网络调优?
下一篇
无影云桌面