欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux系统调优分析

程序员文章站 2022-06-01 12:22:20
...
Linux系统调优分析

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的不符就会直接导致数据在网络传输过程中不断地进行分包、组包,浪费了宝贵的传输时间,也严重影响了宽带的工作效率。
网卡绑定https://blog.csdn.net/DoloresOOO/article/details/84438347
相关标签: linux