Linux云计算架构-系统调优【CPU、IO、网络、内核参数调优】

Linux云计算架构-系统调优【CPU、IO、网络、内核参数调优】

1. CPU调优

①进程优先级调整:使用top命令查看优先级,NI列表示优先级。优先级范围从高到低为[-20,19],默认是0。NI即nice,可以看作老好人,值越大,说明比较好人,占用cpu的时间就越少,优先级就越低。 提高优先级,降低数值大小;降低优先级,提高数值大小;
在这里插入图片描述

②设置进程的cpu亲和力:在多核cpu的情况下,某一进程的运行会在多个cpu核心上切换,cpu上下文切换会带来额外的开销。设置进程的cpu亲和力,即将进程绑定到某个指定的cpu核心上,不进行cpu上下文切换。

cpu上下文切换:每个进程在使用某个cpu核心时,会把所需的数据先写入到cpu的缓存(寄存器)中,然后cpu再根据缓存中的数据进行运算。cpu上下文切换即是指cpu寄存器中数据的写入和读出。

# 使用xshell打开两个终端做测试
# 一个终端打开文件a.txt,生成一个进程
[root@monitor ~]# vim a.txt
# 另一个终端查看进程占用资源情况
[root@monitor ~]# ps aux | grep a.txt
root      10672  0.1  0.2 151808  5388 pts/1    S+   19:18   0:00 vim a.txt
root      10720  0.0  0.0 112724   996 pts/2    S+   19:18   0:00 grep --color=auto a.txt
# 可以看到进程10672在8个cpu核心上都可以运行
[root@monitor ~]# rpm -qf `which taskset`
util-linux-2.23.2-59.el7.x86_64
[root@monitor ~]# taskset -cp 10672
pid 10672's current affinity list: 0-7

# 指定cpu核心运行进程
[root@monitor ~]# taskset -c 1,3 vim b.txt
[root@monitor ~]# ps aux | grep b.txt
root      10799  0.0  0.2 151808  5388 pts/2    S+   19:25   0:00 vim b.txt
root      10801  0.0  0.0 112724  1000 pts/1    S+   19:25   0:00 grep --color=auto b.txt
[root@monitor ~]# taskset -cp 10799
pid 10799's current affinity list: 1,3

③使用vmstat查看系统瓶颈

# 查看系统整体情况,在机器运行较慢时不建议使用top查看,建议使用vmstat查看
[root@monitor ~]# vmstat 
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   8456 384712     36 744960    0    0    37    18   29   32  0  0 99  0  0
==进程====================
r 运行状态的进程个数。展示了正在执行和等待cpu资源的任务个数。当这个值长期大于cpu核心数的3倍,就会出现cpu瓶颈。
b 不可中断睡眠、正在进行IO等待、阻塞状态的进程个数
==内存====================
swpd 使用交换(虚拟)内存的大小,值越大,说明物理内存遇到瓶颈,比较紧张。值大于0,只能说使用了虚拟内存,不代表物理内存使用紧张。
free 空闲的物理内存大小,单位kb
buff 内存从磁盘读出的内容【磁盘到内存】
cache 内存要写入磁盘的内容【内存到磁盘】值越大,说明在cache的文件越多,当频繁访问cache中的文件时,磁盘的读写IO会很小,即基本没有对磁盘进行读写,只在内存中进行读写。
==交换内存================
si swapin换入内存【磁盘到虚拟内存】值大于0,表示物理内存不够用或内存泄漏了。
so swapout换出内存【虚拟内存到磁盘】值大于0,表示物理内存不够用或内存泄漏了。
# si和so在内存足够时值为0,当free值很小时,要看si和so的值是否是0,若是0,则系统性能不会因为free小而受影响。
==IO=====================
bi blockin 从硬盘往内存读的大小
bo blockout 从内存往硬盘写的大小
==system系统==============
in 每秒中断次数,包括时钟中断
cs 每秒上下文切换次数,cpu调度次数越多,cs越大。该值越小越好。
us 系统用户进程使用百分比
sy 内核中的进程占用百分比,当sy值较高时,要检查原因,是不良表现。
id 空闲的cpu百分比
wa cpu等待I/O完成的时间,值越大,说明IO等待比较严重,机器IO性能就越差。
st 虚拟机占用cpu的时间,也称作虚拟机偷取物理内存的时间。

在这里插入图片描述

数据解读:
1、r列进程数为0或1,说明当前系统运行的进程较少。8核心cpu,r的值大于24才认为cpu繁忙。
2、free值为381880KB,大约372MB,内存较少但还是够用的。
3、swap交换内存数据si和so都是0,说明没有使用到交换内存。即物理内存还是够用的。若物理内存不够了,要加内存。
4、IO数据,若bi大,则说明从硬盘读出到内存的数据比较大。若bo大,则说明从内存写入到硬盘的数据比较大。
5、us值越小,id值越大说明系统性能较好,毫无压力。
6、wa值越大,说明cpu等待IO完成的时间比较长,即机器IO性能较差。

其他说明:
1、当系统处于高并发访问时,会消耗cpu,即正在运行的进程数一般会大于3倍cpu核心数。若此时wa值为0,即不存在因IO性能问题占用cpu的时候,故可以认为此时一直都在消耗cpu。可以通过ps或top命令查看进程使用cpu的情况。

2. IO调优

①限制用户运行的最大进程数和单个进程能打开的最大文件数:

# 查看最多可以打开的文件数
[root@master ~]# ulimit -n
1024

# 临时生效
[root@master ~]# ulimit -n 102400
[root@master ~]# ulimit -n
102400

# 修改用户运行的最大进程数和单个进程打开的最大文件数,重新开启新的终端即可生效。
# *为通配符,指所有用户。
[root@master ~]# vim /etc/security/limits.conf
* soft noproc 102400
* hard noproc 102400
* soft nofile 102400
* hard nofile 102400

# 限制用户运行的最大进程数,功能同上。
[root@monitor ~]# cat /etc/security/limits.d/20-nproc.conf 
# Default limit for number of user's processes to prevent
# accidental fork bombs.
# See rhbz #432903 for reasoning.

*          soft    nproc     4096
root       soft    nproc     unlimited

②查看所有的资源限制信息

[root@monitor ~]# ulimit -a
core file size          (blocks, -c) 0    # kdump转储功能打开后产生的core file大小限制
data seg size           (kbytes, -d) unlimited   # 数据段大小限制
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited   # 文件大小限制
pending signals                 (-i) 7144
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 102400      # 单个进程可打开的文件个数限制
pipe size            (512 bytes, -p) 8    # 管道大小的限制
POSIX message queues     (bytes, -q) 819200    # 消息队列大小
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192    # 栈大小
cpu time               (seconds, -t) unlimited   # cpu时间使用限制
max user processes              (-u) 7144        # 最大的用户进程数限制
virtual memory          (kbytes, -v) unlimited   # 虚拟内存限制
file locks                      (-x) unlimited

在这里插入图片描述

③测试硬盘的读写速度

=============================读速度测试===============================================
# 硬盘读速度测试工具
[root@monitor ~]# rpm -qf `which hdparm`
hdparm-9.43-5.el7.x86_64

# 3s从硬盘中读取数据3118MB,平均读取速度为1039.24MB
[root@monitor ~]# hdparm -t --direct /dev/sda

/dev/sda:
 Timing O_DIRECT disk reads: 3118 MB in  3.00 seconds = 1039.24 MB/sec
============================写速度测试=================================================
# 使用dd命令创建一个文件,测试写速度。
[root@monitor ~]# dd if=/dev/zero of=test.dbf bs=1M count=1000 oflag=direct,nonblock
记录了1000+0 的读入
记录了1000+0 的写出
1048576000字节(1.0 GB)已复制,1.28078 秒,819 MB/秒
oflag=direct  读写数据直接采用IO方式,即直接从内存写入硬盘中,不走缓存。
nonblock      读写数据采用非阻塞IP方式,绕开缓存,测试写更准确。

# 在生产环境,建议使用hdparm命令测试硬盘读速度,使用dd命令测试写速度。

============================计算命令运行时间=============================================
[root@monitor ~]# time dd if=/dev/zero of=test.dbf bs=1M count=1000 oflag=direct,nonblock
记录了1000+0 的读入
记录了1000+0 的写出
1048576000字节(1.0 GB)已复制,1.79318 秒,585 MB/秒

real	0m1.797s    # 实际时间>cpu时间=用户cpu时间+系统cpu时间
user	0m0.001s    # 用户cpu时间
sys	0m1.466s        # 系统cpu时间

3. 网络调优

网卡绑定(bonding)技术:网卡绑定,也称为网卡捆绑。是将多块物理网卡虚拟成一块网卡,以提供负载均衡网络冗余

3.1 网络冗余(主备模式)

①配置两张网卡,都为桥接模式。IP地址分别为:192.168.8.134192.168.8.133
在这里插入图片描述
②配置bond0虚拟网卡设备,首先应该移除原来的网卡配置文件。
在这里插入图片描述
③修改bond0网卡配置文件:
在这里插入图片描述
④绑定网卡ens32和网卡ens34bond0

[root@master ~]# nmcli connection add type bond-slave ifname ens32 master bond0 
连接“bond-slave-ens32-1”(68baaf69-7088-4491-9c4a-d275b3e67eda) 已成功添加。
[root@master ~]# nmcli connection add type bond-slave ifname ens34 master bond0 
连接“bond-slave-ens34-1”(6babfeba-6eeb-4795-8da9-2357efc3b775) 已成功添加。
[root@master ~]# ll /etc/sysconfig/network-scripts/ifcfg-*
-rw-r--r--. 1 root root 418 11月  9 21:13 /etc/sysconfig/network-scripts/ifcfg-bond0
-rw-r--r--. 1 root root 127 11月  9 21:13 /etc/sysconfig/network-scripts/ifcfg-bond-slave-ens32-1
-rw-r--r--. 1 root root 127 11月  9 21:13 /etc/sysconfig/network-scripts/ifcfg-bond-slave-ens34-1
-rw-r--r--. 1 root root 254 8月  24 2018 /etc/sysconfig/network-scripts/ifcfg-lo

⑤重启网络,查看bond0的状态:

[root@master ~]# systemctl restart network
# 查看当前已激活的网络接口
[root@master ~]# nmcli connection show --active
NAME                UUID                                  TYPE      DEVICE 
bond0               6f518bf7-4fcc-44ab-8cf6-77cd1a1cd3c9  bond      bond0  
bond-slave-ens32-1  68baaf69-7088-4491-9c4a-d275b3e67eda  ethernet  ens32  
bond-slave-ens34-1  6babfeba-6eeb-4795-8da9-2357efc3b775  ethernet  ens34  
virbr0              a6da33ae-d4f3-4c30-81a0-cf12820e46a9  bridge    virbr0 
# 查看bond0的运行状态
[root@master ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)    # bonding模式,这里是主备模式
Primary Slave: ens32 (primary_reselect always)
Currently Active Slave: ens32   # 当前使用的网卡是ens32
MII Status: up   # 连接状态
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: ens32  # 绑定在bond0的网卡ens32
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:d2:f7:ec
Slave queue ID: 0

Slave Interface: ens34  # 绑定在bond0的网卡ens34
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:d2:f7:f6
Slave queue ID: 0

⑥测试bond0主备模式的高可用:
模拟故障,断开ens32的网络连接:
在这里插入图片描述

[root@master ~]# cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: ens32 (primary_reselect always)
Currently Active Slave: ens34    # 可以看到当前使用的网卡为ens34
MII Status: up    # 连接状态正常
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: ens32
MII Status: down
Speed: Unknown
Duplex: Unknown
Link Failure Count: 1    # 连接失败数:1
Permanent HW addr: 00:0c:29:d2:f7:ec
Slave queue ID: 0

Slave Interface: ens34
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:d2:f7:f6
Slave queue ID: 0

重新连接ens32网卡,然后重启网络服务:
在这里插入图片描述

[root@monitor ~]# systemctl restart network   # 在虚拟机上重启网络服务,否则在ens32重连之后,是无法使用xshell连接上的。
[root@master ~]# cat /proc/net/bonding/bond0 
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: fault-tolerance (active-backup)
Primary Slave: ens32 (primary_reselect always)
Currently Active Slave: ens32  # 可以看到,正在使用的又变成了ens32
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: ens32
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:d2:f7:ec
Slave queue ID: 0

Slave Interface: ens34
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:d2:f7:f6
Slave queue ID: 0

总结下:bondind绑定技术实现网卡的主备模式高可用,当一块网卡损坏时,会由另一块备用网卡顶替,保证服务不中断。但存在一个不人性化的问题,若修复了损坏的网卡设备,要让该网卡重新绑定到bond0上,需要在虚拟机上重启网络服务,否则使用xshell是无法连接上的。

3.2 负载均衡模式

①配置负载均衡模式的bond0:

# 在删除所有的网卡配置文件后,创建bond0网卡设备
[root@master ~]# nmcli connection add type bond ifname bond0 con-name bond0 miimon 100 mode balance-rr ip4 192.168.8.133/24
[root@master ~]# vim /etc/sysconfig/network-scripts/ifcfg-bond0
[root@master ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond0
BONDING_OPTS="miimon=100 mode=balance-rr"
TYPE=Bond
BONDING_MASTER=yes
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=192.168.8.133
PREFIX=24
GATEWAY=192.168.8.1  # 加进去
DNS1=8.8.8.8   # 加进去
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=bond0
UUID=828d6d72-523b-4b51-b738-8116ab14261b
DEVICE=bond0
ONBOOT=yes

②绑定网卡ens32和网卡ens34bond0

[root@master ~]# nmcli connection add type bond-slave ifname ens32 master bond0 
连接“bond-slave-ens32”(59da2797-6c13-4e19-b00c-c2add67a526c) 已成功添加。
[root@master ~]# nmcli connection add type bond-slave ifname ens34 master bond0 
连接“bond-slave-ens34”(5495ea02-e9fb-40f1-969f-a7be6e77fffb) 已成功添加。
[root@master ~]# ll /etc/sysconfig/network-scripts/ifcfg-bond*
-rw-r--r--. 1 root root 401 11月  9 21:54 /etc/sysconfig/network-scripts/ifcfg-bond0
-rw-r--r--. 1 root root 125 11月  9 21:58 /etc/sysconfig/network-scripts/ifcfg-bond-slave-ens32
-rw-r--r--. 1 root root 125 11月  9 21:59 /etc/sysconfig/network-scripts/ifcfg-bond-slave-ens34
[root@master ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond-slave-ens32
TYPE=Ethernet
NAME=bond-slave-ens32
UUID=59da2797-6c13-4e19-b00c-c2add67a526c
DEVICE=ens32
ONBOOT=yes
MASTER=bond0
SLAVE=yes
[root@master ~]# cat /etc/sysconfig/network-scripts/ifcfg-bond-slave-ens34
TYPE=Ethernet
NAME=bond-slave-ens34
UUID=5495ea02-e9fb-40f1-969f-a7be6e77fffb
DEVICE=ens34
ONBOOT=yes
MASTER=bond0
SLAVE=yes

③重启网络,查看bond0的状态:

[root@master ~]# systemctl restart network
[root@master ~]# nmcli connection show --active 
NAME              UUID                                  TYPE      DEVICE 
bond0             828d6d72-523b-4b51-b738-8116ab14261b  bond      bond0  
bond-slave-ens32  59da2797-6c13-4e19-b00c-c2add67a526c  ethernet  ens32  
bond-slave-ens34  5495ea02-e9fb-40f1-969f-a7be6e77fffb  ethernet  ens34  
virbr0            a6da33ae-d4f3-4c30-81a0-cf12820e46a9  bridge    virbr0 
[root@master ~]# cat /proc/net/bonding/bond0 
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011)

Bonding Mode: load balancing (round-robin)   # 负载均衡,轮询
MII Status: up  # 连接状态
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

Slave Interface: ens32   # 绑定在bond0的网卡ens32
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:d2:f7:ec
Slave queue ID: 0

Slave Interface: ens34  # 绑定在bond0的网卡ens34
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: 00:0c:29:d2:f7:f6
Slave queue ID: 0

④测试bonding负载均衡:

[root@master ~]# watch cat /proc/net/dev
可以看到ens32和ens34都在使用。

在这里插入图片描述

4. 内核参数调优

预防以及解决DDOS洪水攻击

# 修改/etc/sysctl.conf配置文件为以下参数,可有效预防DDOS洪水攻击。在服务器上线之前,都应该配置如下内核参数。
[root@monitor ~]# vim /etc/sysctl.conf 
net.ipv4.tcp_synack_retries = 0   # 当发送SYN+ACK握手包给客户端时,若收不到客户端发送的ACK确认,服务端则不重发SYN+ACK握手包,加快半连接的回收,不耗光资源。默认为重发5次,每次等待30-40s,即半连接状态会保持180s左右才会断开连接。
net.ipv4.tcp_syn_retries = 1      # 客户端重发SYN握手包的次数
net.ipv4.tcp_max_syn_backlog = 20480  # 半连接队列长度
net.ipv4.tcp_syncookies = 0   # 关闭当出现半连接溢出时,向对方发送syncookies的功能 ,1为打开,在外网环境不要打开。  
net.ipv4.tcp_tw_reuse = 0   # 关闭TIME_WAIT状态的连接重用功能,1为打开,在外网环境不要打开。 
net.ipv4.tcp_tw_recycle = 0  # 关闭TIME_WAIT状态的连接回收功能,1为打开,在外网环境不要打开。 
net.ipv4.tcp_fin_timeout = 10    # TCP保持在FIN_WAIT_2状态的时间
fs.file-max = 819200    # 系统允许的文件句柄的最大数目,因为连接需要占用文件句柄
net.core.somaxconn = 65535   # 用来应对突发的大并发connect 请求
net.core.rmem_max = 1024123000  # 最大的TCP 数据接收缓冲(字节)
net.core.wmem_max = 16777216    # 最大的 TCP 数据发送缓冲(字节)
net.core.netdev_max_backlog = 165536   # 网络设备接收数据包的速率比内核处理数据包的速率快时,允许送到队列的数据包的最大数目
net.ipv4.ip_local_port_range = 10000 65535   # 本机主动连接其他主机时的端口分配范围

================================================================================================
# 具体内核参数文件:
[root@master ~]# cd /proc/sys/
[root@master sys]# ll
总用量 0
dr-xr-xr-x. 1 root root 0 11月  9 22:51 abi
dr-xr-xr-x. 1 root root 0 11月  9 20:26 crypto
dr-xr-xr-x. 1 root root 0 11月  9 22:51 debug
dr-xr-xr-x. 1 root root 0 11月  9 22:51 dev
dr-xr-xr-x. 1 root root 0 11月  9 20:26 fs
dr-xr-xr-x. 1 root root 0 11月  9 20:26 kernel
dr-xr-xr-x. 1 root root 0 11月  9 20:26 net
dr-xr-xr-x. 1 root root 0 11月  9 22:51 sunrpc
dr-xr-xr-x. 1 root root 0 11月  9 22:51 user
dr-xr-xr-x. 1 root root 0 11月  9 20:26 vm

# 查看net.ipv4.ip_local_port_range的值:
[root@master sys]# cat ./net/ipv4/ip_local_port_range
32768	60999

猜你喜欢

转载自blog.csdn.net/weixin_36522099/article/details/109577683