CentOS 7系统优化与部署手册

本手册详细介绍了CentOS 7系统从内核升级、安全加固到性能调优的全方位优化方案,包含防火墙设置、swap分区管理、日志优化、SSH服务优化等关键运维操作,并提供了常用的系统监控命令集。

这篇文章已发布 1734 天,部分内容可能已过时。如有疑问,可在评论区留言。

centos7内核升级

下载内核源

1
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

装最新版本内核

1
yum --enablerepo=elrepo-kernel install -y kernel-lt 

查看

1
cat /boot/grub2/grub.cfg |grep menuentry

设置开机从新内核启动

1
grub2-set-default "CentOS Linux (4.4.221-1.el7.elrepo.x86_64) 7 (Core)"

关闭防火墙

1
2
systemctl stop firewalld
systemctl disable firewalld

安装常用工具

1
2
3
4
5
6
 yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim git net-tools dos2unix lsof tcpdump lrzsz telnet bash-completion.noarch conntrack-tools



linux 补全
yum install libvirt-bash-completion bash-completion gedit-plugin-bracketcompletion gedit-plugin-wordcompletion libguestfs-bash-completion -y

setenforce

1
2
setenforce 0
sed -i '/^SELINUX=/ s/enforcing/disabled/'  /etc/selinux/config

更新histroy和shell保持时间

1
2
3
4
5
vim /etc/profile


export HISTSIZE=100
export TMOUT=300

关掉swap分区

1
2
3
4
5
swapoff -a
# 如果想永久关掉swap分区,打开如下文件注释掉swap哪一行即可.
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
echo "vm.swappiness = 0">> /etc/sysctl.conf
sysctl -p

邮件服务关闭

1
2
systemctl stop postfix.service
systemctl disable postfix.service

日志优化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
mkdir /var/log/journal
mkdir /etc/systemd/journald.conf.d
cat > /etc/systemd/journald.conf.d/99-prophet.conf << EOF
[journal]
# 持久化保存到磁盘
Storage=persistent
# 压缩历史日志
Compress=yes
 
SyncIntervalSec=5m
RateLimitInterval=30s
RateLimitBurst=1000
# 最大占用空间 10G
SystemMaxUse=10G
# 但日志文件最大 200M
SystemMaxFileSize=200M
# 日志保持时间2周
MaxRetentionSec=2week
# 不将日志转发到syslog
ForwardToSyslog=no
 
EOF
systemctl restart systemd-journald

加载ipvs

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
 
chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules

文件优化

echo ‘* - nofile 65535 ’ »/etc/security/limits.conf echo ‘vm.max_map_count=262144 ’ »/etc/security/limits.conf

sysctl vm.overcommit_memory=1

tail -1 /etc/security/limits.conf sysctl -p

内核优化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
cat >>/etc/sysctl.conf<<EOF
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_keepalive_time = 1200
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_max_tw_buckets = 36000

net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 262144
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_orphans = 16384

net.ipv4.tcp_mem = 94500000 915000000 927000000
EOF

sysctl -p

??? note “详细” net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。

net.ipv4.tcp_keepalive_time = 1200 表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。

net.ipv4.ip_local_port_range = 1024 65000 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。

net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。

net.ipv4.tcp_max_tw_buckets = 5000表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。

sshd 服务优化

1
2
3
4
5
6
7
vim /etc/ssh/sshd_config

GSSAPIAuthentication 赋值为no

UseDNS,赋值为 no(该项默认不启用的,要把前面的#删除掉)

重启systemctl restart sshd

二、系统相关命令

1.CPU 核数 和 型号 和 主频

1
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

2.测试磁盘 IO 性能

1).hdparm 命令

hdparm 命令提供了一个命令行的接口用于读取和设置IDE或SCSI硬盘参数,注意该命令只能测试磁盘的读取速率。

1
2
3
4
5
[root@server-68.2.stage.polex.io var ]$ hdparm -Tt /dev/polex_pv/varvol
 
/dev/polex_pv/varvol:
 Timing cached reads:    MB in  2.00 seconds = 7803.05 MB/sec
 Timing buffered disk reads:  MB in  3.01 seconds = 374.90 MB/sec

2).dd 命令

Linux dd 命令用于读取、转换并输出数据。dd 可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。

我们可以利用 dd 命令的复制功能,测试某个磁盘的 IO 性能,须要注意的是 dd 命令只能大致测出磁盘的 IO 性能,不是非常准确。

1
2
3
4
5
6
7
8
[root@server-68.2.stage.polex.io var ]$ time dd if=/dev/zero of=test.file bs=1G count= oflag=direct
+ records in
+ records out
 bytes (2.1 GB) copied, 13.5487 s,  MB/s
 
real    0m13.556s
user    0m0.000s
sys    0m0.888s 

??? note “参数说明” 可以看到,该分区磁盘写入速率为 159M/s,其中:

/dev/zero 伪设备,会产生空字符流,对它不会产生 IO 。
if 参数用来指定 dd 命令读取的文件。
of 参数用来指定 dd 命令写入的文件。
bs 参数代表每次写入的块的大小。
count 参数用来指定写入的块的个数。
offlag=direc 参数测试 IO 时必须指定,代表直接写如磁盘,不使用 cache 。

3).FIO测试磁盘IO性能

fio 命令是专门测试 iops 的命令,比 dd 命令准确,fio 命令的参数很多,这里举几个例子供大家参考:

1
yum install fio
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 随机读:
fio -filename=/dev/sda1 -direct=1 -iodepth 1 -thread -rw=randread -ioengine=psync -bs=4k -size=60G -numjobs=64 -runtime=10 -group_reporting -name=file
# 顺序读:
fio -filename=/dev/sda1 -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=4k -size=60G -numjobs=64 -runtime=10 -group_reporting -name=file
# 随机写:
fio -filename=/dev/sda1 -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=4k -size=60G -numjobs=64 -runtime=10 -group_reporting -name=file
# 顺序读:
fio -filename=/dev/sda1 -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=4k -size=60G -numjobs=64 -runtime=10 -group_reporting -name=file
# 混合随机读写:
fio -filename=/dev/sda1 -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=30 -ioengine=psync -bs=4k -size=60G -numjobs=64 -runtime=10 -group_reporting -name=file -ioscheduler=noop

文中bw=1532.2KB/s, iops=383即是测试出的iops

??? note “参数说明”

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
    filename=/dev/sda1:测试文件名称,通常选择需要测试的盘的data目录
    direct=1:测试过程绕过机器自带的buffer。使测试结果更真实
    rw=randwrite:测试随机写的I/O
    rw=randrw:测试随机写和读的I/O
    rw=randread:测试随机读的I/O
    bs=4k:单次io的块文件大小为4k
    bsrange=512-2048:同上,提定数据块的大小范围
    size=60g:本次的测试文件大小为60g,以每次4k的io进行测试
    numjobs=64:本次的测试线程为64
    runtime=10:测试时间为10秒,如果不写则一直将5g文件分4k每次写完为止
    ioengine=psync:io引擎使用pync方式
    rwmixwrite=30:在混合读写的模式下,写占30%
    group_reporting:关于显示结果的,汇总每个进程的信息。
    此外
    lockmem=1g:只使用1g内存进行测试
    zero_buffers:用0初始化系统buffer
    nrfiles=8:每个进程生成文件的数量。

4).iostat 命令

先用iostat查看磁盘io 是否读写负载很高 如果%util接近100%,表明I/O请求太多,I/O系统已经满负荷,磁盘可能存在瓶颈,一般%util大于70%,I/O压力就比较大,读取速度有较多的wait,然后再看其他的参数

1
2
3
yum install sysstat

iostat -x 1 10

??? note “解释”

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
    rrqm/s:每秒进行merge的读操作数目。即delta(rmerge)/s
    wrqm/s:每秒进行merge的写操作数目。即delta(wmerge)/s
    r/s:每秒完成的读I/O设备次数。即delta(rio)/s
    w/s:每秒完成的写I/0设备次数。即delta(wio)/s
    rsec/s:每秒读扇区数。即delta(rsect)/s
    wsec/s:每秒写扇区数。即delta(wsect)/s
    rKB/s:每秒读K字节数。是rsec/s的一半,因为每扇区大小为512字节

    wKB/s:每秒写K字节数。是wsec/s的一半
    avgrq-sz:平均每次设备I/O操作的数据大小(扇区)。即delta(rsect+wsect)/delta(rio+wio)
    avgqu-sz:平均I/O队列长度。即delta(aveq)/s/1000(因为aveq的单位为毫秒)
    await:平均每次设备I/O操作的等待时间(毫秒)。即delta(ruse+wuse)/delta(rio+wio)
    svctm:平均每次设备I/O操作的服务时间(毫秒)。即delta(use)/delta(rio+wio)
    %util:一秒中有百分之多少的时间用于I/O操作,或者说一秒中有多少时间I/O队列是非空的

5).iotop 命令

找出使用io高的进程的工具 直接执行 iotop 命令

1
yum install iotop -y

3.sar 命令

sar -u 1 1 表示查看CPU利用率 每隔1秒写入1次 sar 命令是分析系统瓶颈的神器,可以用来查看 CPU 、内存、磁盘、网络等性能。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@server-68.2.stage.polex.io var ]$ sar -d -p
Linux 3.10.-693.5..el7.x86_64 (server-)     //     _x86_64_    ( CPU)
 
:: PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
:: PM       sda      1.00      0.00      3.00      3.00      0.01      9.00      9.00      0.90
:: PM       sdb      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
:: PM polex_pv-rootvol      1.00      0.00      3.00      3.00      0.01      9.00      9.00      0.90
:: PM polex_pv-varvol      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
:: PM polex_pv-homevol      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
 
:: PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
:: PM       sda      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
:: PM       sdb      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
:: PM polex_pv-rootvol      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
:: PM polex_pv-varvol      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
:: PM polex_pv-homevol      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
 
Average:          DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
Average:          sda      0.50      0.00      1.50      3.00      0.00      9.00      9.00      0.45
Average:          sdb      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:    polex_pv-rootvol      0.50      0.00      1.50      3.00      0.00      9.00      9.00      0.45
Average:    polex_pv-varvol      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:    polex_pv-homevol      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

其中, “-d”参数代表查看磁盘性能,“-p”参数代表将 dev 设备按照 sda,sdb……名称显示,“1”代表每隔1s采取一次数值,“2”代表总共采取2次数值。

??? note “参数说明” await:平均每次设备 I/O 操作的等待时间(以毫秒为单位)。

svctm:平均每次设备 I/O 操作的服务时间(以毫秒为单位)。

%util:一秒中有百分之几的时间用于 I/O 操作。

对于磁盘 IO 性能,一般有如下评判标准:

正常情况下 svctm 应该是小于 await 值的,而 svctm 的大小和磁盘性能有关,CPU 、内存的负荷也会对 svctm 值造成影响,过多的请求也会间接的导致 svctm 值的增加。

await 值的大小一般取决与 svctm 的值和 I/O 队列长度以 及I/O 请求模式,如果 svctm 的值与 await 很接近,表示几乎没有 I/O 等待,磁盘性能很好,如果 await 的值远高于 svctm 的值,则表示 I/O 队列等待太长,系统上运行的应用程序将变慢,此时可以通过更换更快的硬盘来解决问题。

%util 项的值也是衡量磁盘 I/O 的一个重要指标,如果 %util 接近 100% ,表示磁盘产生的 I/O 请求太多,I/O 系统已经满负荷的在工作,该磁盘可能存在瓶颈。长期下去,势必影响系统的性能,可以通过优化程序或者通过更换更高、更快的磁盘来解决此问题。

4.vmstat 命令

1
2
3
[root@server-68.2.stage.polex.io var ]$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st

输出结果中,bi bo 可以表示磁盘当前性能:

bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是 1024 byte 。

bo 块设备每秒发送的块数量,例如我们读取文件,bo 就要大于0。bi 和 bo 一般都要接近 0,不然就是 IO 过于频繁,需要调整。

5.uptime命令

1
2
3
4
5
6
uptime

输出的信息依次为:系统现在的时间、系统从上次开机到现在运行了多长时间、有多少用户登陆、系统在1分钟内,

5分钟内,15分钟内的平均负载。
load average的三个值如果长期大于系统中CPU个数,说明CPU负载很高,可能会影响系统性能。

6.TCP/IP 相关

1).netstat命令

1
netstat -an |grep tcp 查看当前所有的TCP连接相关信息

2).Socket Statistics命令

之前采用netstat命令会发现在服务器繁忙的时候效果不理想,有时会占用高达90%以上的CPU。

而Socket Statistics(ss)命令底层使用TCP协议栈中用于分析统计的tcp_diag模块,所以速度更快、更高效。

ss -t 显示系统目前所有TCP连接的连接情况

??? note “介绍” -t 只显示TCP连接信息

-a 显示所有连接信息

-u 只显示UDP连接信息

几乎所有的Linux系统都会默认包含netstat命令,但并非都会包含ss命令(Centos默认包含)。

ss命令包含iproute工具集中,这是一套可以支持IPv4/IPv6网络的用于管理TCP/UDP/IP网络的工具集。

如果找不到ss命令,可以如下安装此工具集: yum install iproute iproute-doc

7.磁盘I/O、吞吐量和存储IOPS

磁盘I/O、吞吐量和IOPS性能指标

云服务器磁盘存储性能指标包括磁盘I/O、IOPS和吞吐量,服务器百科来详细说下磁盘I/O、存储IOPS、和吞吐量意义详解,及磁盘IO、IOPS和吞吐量之间的关系:

  • 存储IOPS:磁盘IOPS是指一秒内磁盘进行多少次I/O读写;
  • 磁盘I/O:I/O,即input/output,磁盘的输入输出,输入指的是对磁盘写入数据,输出指的是从磁盘读出数据,磁盘I/O可以理解为读写。应用发起的一次或多次数据请求,I/O请求的数据量又称I/O大小,单位为KiB,例如4KiB、256KiB、1024KiB等;
  • 磁盘吞吐量:每秒磁盘I/O的流量,即磁盘写入加上读出的数据的大小。

存储IOPS、磁盘I/O和吞吐量关系公式

存储IOPS、磁盘I/O和吞吐量之间的关系公式为:吞吐量 = IOPS * I/O大小

也就是说,磁盘I/O越大,IOPS越高,那么磁盘那么每秒I/O的吞吐量就越高,根据公式服务器百科网认为IOPS和吞吐量的数值越高越好,实际上磁盘IOPS和吞吐量两个参数是有最大值的。

关于云服务器磁盘存储I/O性能详细说明可以参考阿里云ecs6.com关于云服务器存储I/O性能的说明。

常见的linux监控命令

free

df

top / htop

uptime

iftop

iostat

iotop

vmstat

netstat

nethogs 每个进程用了多少流量

面朝大海,春暖花开。
使用 Hugo 构建
主题 StackJimmy 设计