Linux系统调优分析
程序员文章站
2022-06-01 12:22:20
...
1、有关CPU调优分析
cpu处理方式:
1.批处理,顺序处理请求。(切换次数少,吞吐量大)
2.分时处理。(如同"独占",吞吐量小)(时间片,把请求分为一个一个的时间片,一片一片的分给CPU处理)我们现在使用x86就是这种架构
3.实时处理:一般用于单片机上,比如电梯的上下控制,对于按键等动作要求进行实时处理。
我们可以通过查看/boot/config查看一下内核一秒钟中断CPU次数,/boot/config-3.10.0-327.el7.x86_64是编译内核的参数文件。
[[email protected] ~]# grep HZ /boot/config-3.10.0-327.el7.x86_64
CONFIG_NO_HZ_COMMON=y
# CONFIG_HZ_PERIODIC is not set
# CONFIG_NO_HZ_IDLE is not set
CONFIG_NO_HZ_FULL=y
# CONFIG_NO_HZ_FULL_ALL is not set
CONFIG_NO_HZ=y
# CONFIG_RCU_FAST_NO_HZ is not set
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
CONFIG_HZ_1000=y
CONFIG_HZ=1000 #1秒钟1000次中断
CONFIG_MACHZ_WDT=m
调整进程优先级使用更多的CPU
调整进程nice值,让进程使用更多的cpu
优先级控制:nice值作用:以什么优先级运行进程。默认优先级是0 #范围 -20~19 越小优先级越高 普通用户0-19
[[email protected] ~]# vim 1.txt
在另一个终端
[[email protected] ~]# ps aux | grep vim
root 5053 0.1 0.1 151444 5196 pts/0 S+ 18:07 0:00 vim 1.txt
root 5056 0.0 0.0 112644 952 pts/2 S+ 18:08 0:00 grep --color=auto vim
可以查看默认nice值为0
[[email protected] ~]# top -p 5053
top - 18:08:28 up 5:06, 3 users, load average: 0.01, 0.02, 0.05
Tasks: 1 total, 0 running, 1 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 : 3866948 total, 3225192 free, 166468 used, 475288 buff/cache
KiB Swap: 4063228 total, 4063228 free, 0 used. 3467116 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5053 root 20 0 151444 5196 2588 S 0.0 0.1 0:00.04 vim
[[email protected] ~]# nice -n -5 vim 1.txt
在另一个终端
[[email protected] ~]# ps aux | grep vim
root 5058 0.2 0.1 151444 5196 pts/0 S<+ 18:09 0:00 vim 1.txt
root 5062 0.0 0.0 112644 952 pts/2 S+ 18:09 0:00 grep --color=auto vim
[[email protected] ~]# top -p 5058
top - 18:09:24 up 5:07, 3 users, load average: 0.00, 0.01, 0.05
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.1 sy, 0.0 ni, 99.8 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3866948 total, 3224852 free, 166824 used, 475272 buff/cache
KiB Swap: 4063228 total, 4063228 free, 0 used. 3466776 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5058 root 15 -5 151444 5196 2588 S 0.0 0.1 0:00.04 vim
这里可以看到nice值已经修改为-5
修改正在运行的进程nice值
Usage: renice -n 【nice值】 PID
[[email protected] ~]# renice -n -10 5058
5058 (process ID) old priority -5, new priority -10
CPU亲和力(affinity):将一个或多个进程绑定到一个或多个处理器上运行
taskset 作用:在多核情况下,可以认为指定一个进程在哪颗CPU上执行程序,减少进程在不同CPU之前切换的开销。
查看物理cpu数量:
[[email protected] ~]# cat /proc/cpuinfo | grep "physical id" | sort -u | wc -l
2
查看每个物理cpu有几核心:
[[email protected] ~]# cat /proc/cpuinfo | grep "cores" | uniq
cpu cores : 2
Usage: taskset [options] [mask | cpu-list] [pid|cmd [args...]]
Options:
-a, --all-tasks 将一个进程中所有的TID都执行一次CPU亲和性设置
-p, --pid 操作已存在的PID
-c, --cpu-list 声明CPU的亲和力使用数字表示
[[email protected] ~]# vim 1.txt &
[1] 6076
[[email protected] ~]# taskset -p 6076
pid 6076's current affinity mask: f #f说明这个进程在4颗cpu上随机切换
[1]+ Stopped vim 1.txt
值的计算方法
Cpu ID 号码,对应的16进制数为:
CPU ID: 7 6 5 4 3 2 1 0
对应的数为: 128 64 32 16 8 4 2 1
我这里4核 CPU ID即为 0,1,2,3 值为(1+2+4+8=15对应16进制数为f)
[[email protected] ~]# taskset -cp 6076
可以查看到此进程在所有cpu上运行
pid 6076's current affinity list: 0-3
指定进程运行的cpu
[[email protected] ~]# taskset -c 1,3 vim 1.txt &
[1] 6141
[[email protected] ~]# taskset -p 6141
pid 6141's current affinity mask: a
[[email protected] ~]# taskset -cp 6141
pid 6141's current affinity list: 1,3
CPU利用比率分配
如果一个CPU充分被使用:
65% 70% User Time 用户态
30% 35% System Time 内核态
0% 5% Idle Time 空闲
Context Switches 上下文切换的数目直接关系到CPU 的使用率,如果CPU 利用率保持在上述均衡状态时,有大量的上下文切换是正常的。
[[email protected] ~]# vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 3221672 952 478732 0 0 2 1 17 28 0 0 100 0 0
0 0 0 3221780 952 478732 0 0 0 0 76 119 0 0 100 0 0
0 0 0 3221780 952 478732 0 0 0 0 69 106 0 0 100 0 0
如果有大量的中断(in)和较少的上下文切换(cs)。这意味着一个单一的进程正在大量使用cpu
如果上下文切换数目高于中断数目,说明kernel中相当数量的时间都开销在:上下文切换线程.
大量的上下文切换将导致CPU 利用率不均衡,如果等待io 请求的百分比(wa)非常高,以及user time百分比非常低(us). 说明磁盘比较慢,磁盘是瓶颈、因为CPU 都阻塞在IO请求上,所以运行队列里也有相当数个的可运行状态线程在等待执行.
2、有关I/O
资源限制:/etc/security/limits.conf
#<domain> <type> <item> <value>
#@faculty soft nproc 20
#@faculty hard nproc 50
soft软限制是一个警告值,而hard硬限制则是一个真正意义的阀值,超过就会报错。soft一定要比hard小。
显示目前资源限定
[[email protected] ~]# ulimit -a
core file size (blocks, -c) 0 设定core文件的最大值,单位为区块
data seg size (kbytes, -d) unlimited 程序数据节区的最大值,单位为KB
scheduling priority (-e) 0
file size (blocks, -f) unlimited shell所能建立的最大文件,单位为区块
pending signals (-i) 15023
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited 指定可使用内存的上限,单位为KB
open files (-n) 1024 指定同一时间最多可打开的文件数
pipe size (512 bytes, -p) 8 指定管道缓冲区的大小,单位512字节
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192 指定堆叠的上限,单位为KB
cpu time (seconds, -t) unlimited 指定CPU使用时间的上限,单位为秒
max user processes (-u) 15023 用户最多可启动的进程数目
virtual memory (kbytes, -v) unlimited 指定可使用的虚拟内存上限,单位为KB
file locks (-x) unlimited
Linux系统里打开文件描述符的最大值,一般缺省值是1024
[[email protected] ~]# ulimit -n
1024
硬盘速度测试
测试速度
[[email protected] ~]# hdparm -T -t /dev/sda
/dev/sda:
Timing cached reads: 17000 MB in 2.00 seconds = 8506.81 MB/sec
#2秒中直接从内存的 cache读取数据的速度读
Timing buffered disk reads: 162 MB in 3.01 seconds = 53.81 MB/sec
#3.01秒中从硬盘缓存中读
-a<快取分区> 设定读取文件时,预先存入块区的分区数,若不加上<快取分区>选项,则显示目前的设定。
-A<0或1> 启动或关闭读取文件时的快取功能。
-c 设定IDE32位I/O模式。
-C 检测IDE硬盘的电源管理模式。
-d<0或1> 设定磁盘的DMA模式。
-f 将内存缓冲区的数据写入硬盘,并清楚缓冲区。
-g 显示硬盘的磁轨,磁头,磁区等参数。
-h 显示帮助。
-i 显示硬盘的硬件规格信息,这些信息是在开机时由硬盘本身所提供。
-I 直接读取硬盘所提供的硬件规格信息。
-k<0或1> 重设硬盘时,保留-dmu参数的设定。
-K<0或1> 重设硬盘时,保留-APSWXZ参数的设定。
-m<磁区数> 设定硬盘多重分区存取的分区数。
-n<0或1> 忽略硬盘写入时所发生的错误。
-p 设定硬盘的PIO模式。
-P<磁区数> 设定硬盘内部快取的分区数。
-q 在执行后续的参数时,不在屏幕上显示任何信息。
-r<0或1> 设定硬盘的读写模式。
-S<时间> 设定硬盘进入省电模式前的等待时间。
-t 评估硬盘的读取效率。
-T 评估硬盘快取的读取效率。
-u<0或1> 在硬盘存取时,允许其他中断要求同时执行。
-v 显示硬盘的相关设定。
-W<0或1> 设定硬盘的写入快取。
-X<传输模式> 设定硬盘的传输模式。
-y 使IDE硬盘进入省电模式。
-Y 使IDE硬盘进入睡眠模式。
-Z 关闭某些Seagate硬盘的自动省电功能。
3、网络相关
修改内核参数
[[email protected] ~]# vim /etc/sysctl.conf
net.ipv4.tcp_synack_retries = 0 #tcp回应第二个握手包(SYN+ACK),如果收不到第三次握手包(ACK),不进行重试。
net.ipv4.tcp_syn_retries = 1 #当没有收到服务器的SYN+ACK包时,客户端重发SYN握手包的次数。
net.ipv4.tcp_max_syn_backlog = 20480 #半连接队列长度,增加SYN队列长度到20480:加大SYN队列长度可以容纳更多等待连接的网络连接数
net.ipv4.tcp_syncookies = 1 #当出现 半连接 队列溢出时向对方发送syncookies
原理:在Tcp服务器收到Tcp Syn包并返回Tcp Syn+ack包时,不专门分配一个数据区,而是根据这个Syn包计算出一个cookie值。在收到Tcp ack包时,Tcp服务器在根据那个cookie值检查这个Tcp ack包的合法性。如果合法,再分配专门的数据区进行处理未来的TCP连接。
默认为0,1表示开启
net.ipv4.tcp_tw_reuse = 1 #表示开启重用。允许将TIME_WAIT sockets重新用于新的TCP连接,默认为0,表示关闭e
net.ipv4.tcp_tw_recycle = 1 #表示开启TCP连接中TIME_WAIT sockets的快速回收,默认为0,表示关闭
net.ipv4.tcp_fin_timeout = 10 #表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN_WAIT_2状态的时间
fs.file-max = 819200 #系统允许的文件句柄的最大数目,因为连接需要占用文件句柄
net.core.somaxconn = 65535 #表示socket监听的backlog上限
net.core.rmem_max = 1024123000 #最大的TCP 数据接受缓冲(字节)
net.core.wmem_max = 16777126 #最大的TCP 数据发送缓冲(字节)
net.core.netdev_max_backlog = 165536 #当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包。这个参数表示该队列的最大值
net.ipv4.ip_local_port_range = 10000 65535 #表示允许系统打开的端口范围
[[email protected] ~]# sysctl -p
调整mtu
[[email protected] ~]# ifconfig | grep -i mtu
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
调整mtu
ifconfig 【网卡名】 mtu 【数值】
MTU,即Maximum Transmission Unit(最大传输单元),此值设定TCP/IP协议传输数据报时的最大传输单元。
系统与ISP之间MTU的不符就会直接导致数据在网络传输过程中不断地进行分包、组包,浪费了宝贵的传输时间,也严重影响了宽带的工作效率。