Linux-centos系统优化
Posted 徐中祥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux-centos系统优化相关的知识,希望对你有一定的参考价值。
Linux操作系统优化
一、开启VT和HT
Hyper-Threading(HT)
基本做云平台的,VT 和 HT 打开都是必须的,超线程技术(HT)就是利用特殊的硬件指令,把两个逻辑内核模拟
成两个物理芯片,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了 CPU 的闲置时 间,提高的 CPU 的运行效率。
二、关闭 CPU 节能
关闭节能后,对性能还是有所提升的,所以坚决调整成性能型(Performance)。当然也可以在操作系统级别进行
# 也可以在系统层面进行设置,配置方法如下:
for CPUFREQ in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do [ -f $CPUFREQ ] || continue; echo -n performance > $CPUFREQ; done
三、yum源处理与常用软件包安装
# 一:先在测试环境,配置好yum源
默认国外的yum源(软件仓库)比较慢,所以换成国内的。
# 1.1、备份
[root@egon ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 1.2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/
[root@egon ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 1.3.添加epel源
[root@egon ~]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
# 二:然后执行yum update -y,以及安装常用软件包,然后执行部署,将部署过程中安装的包缓存本地
[root@egon ~]# yum update -y # 刚装完系统后就立即执行,日后就不要轻易更新了
[root@egon ~]# yum -y install tree nmap sysstat lrzsz telnet bash-completion bash-completion-extras vim lsof net-tools rsync ntpdate nfs-utils
# 三:将所有主机上的软件包汇总到一起,做成一个自己的yum源用来后期使用
四、规范系统主机名
hostnamectl set-hostname 主机名 # 主机名能够反映出主机的作用即可
五、添加hosts文件
# 编辑好之后,每台机器都发一份
vim /etc/hosts
172.16.10.11 nc1 ceph-deploy
172.16.10.12 nc2
172.16.10.13 nc3
172.16.10.14 cs1
172.16.10.15 cs2
172.16.10.16 cs3
# 实现集群主机之间相互用主机名解析
六、关闭SELinux
SELinux(Security-Enhanced Linux)是美国国家安全局(NSA)对于强制访问控制的实现,这个功能让系统管理员又爱又恨,这里我们还是把它给关闭了吧,至于安全问题,后面通过其他手段来解决,这也是大多数生产环境的做法,如果非要开启也是可以的。
#临时关闭
[root@egon ~]# setenforce 0
#永久关闭,修改完配置后重启主机
[root@egon ~]# sed 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
#检查结果
[root@egon ~]# grep "disabled" /etc/selinux/config
七、关闭防火墙
关闭防火墙的目的是为了让初学者学习更方便,将来在学了Firewalld技术后可再统一开启。 在企业环境中,一般只有配置外网IP的linux服务器才需要开启防火墙,但即使是有外网IP,对于高并发高流量的业务服务器仍是不能开的,因为会有较大性能损失,导致网站访问很慢,这种情况下只能在前端加更好的硬件防火墙了。
# 临时关闭
[root@egon ~]# systemctl stop firewalld
# 设置开机不启动
[root@egon ~]# systemctl disable firewalld
八、配置系统时间
#给定时任务加上注释
[root@egon ~]# echo '#Timing synchronization time' >>/var/spool/cron/root
#定时任务
[root@egon ~]# echo '0 */1 * * * /usr/sbin/ntpdate ntp1.aliyun.com &>/dev/null' >>/var/spool/cron/root
#检查结果
[root@egon ~]# crontab -l
九、系统内核优化
1、ulimit命令介绍
我们可以ulimit命令对系统资源进行控制,选项如下
设置用户级所能打开的最大进程数目:-u选项
ulimit -u 3
设置用户级所能分配到的文件描述符数量:-n选项
ulimit -n 12
2、控制用户开启的最大进程数目
[root@egon ~~]# useradd egon
[root@egon ~~]# ulimit -u 3 # 每个用户能同时开启的最大进程数均只有3个
[root@egon ~~]# su - egon # 切换到egon用户下,先执行了一个bash解释器进程,此外还能再开俩个
[egon@egon ~~]$ sleep 1000 &
[1] 1435
[egon@egon ~~]$ sleep 2000 &
[2] 1436
[egon@egon ~~]$ sleep 3000 &
-bash: fork: retry: 资源暂时不可用
-bash: fork: retry: 资源暂时不可用
-......
# 注意:
1、ulimit -u 3是限制每个用户能同时开启的最大进程数均只有3,而不是累计到一起总共有3个
2、测试的时候sleep后的时间长一点,模拟出同时开启多个进程的效果,不然执行一条短命令很快就结束了
3、文件描述符
进程每打开一个文件,操作系统内核就会为该打开的文件分配一个编号(非负整数),该编号称之为文件描述符(File Descriptor)或者文件handle->也有人将其译为文件句柄
文件打开后的处理逻辑:
进程->文件描述符->操作系统内核->一个具体的文件
即内核(kernel)就是利用文件描述符(file descriptor)来访问文件
在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于UNIX、Linux这样的操作系统。
更多关于描述符的概念:https://www.cnblogs.com/linhaifeng/articles/13959014.html
进程每打开一个文件,操作系统就会为进程分配一个对应的文件描述符。文件描述符的数目是可以设置的,而一旦设置过小,进程会随着打开的文件数增多,因为达到了文件描述的上限而无法打开文件,从而抛出异常
# 文件描述符测试代码
[root@egon ~~]# cat test1.py
import os
import time
from threading import Thread
print(os.getpid())
def task(n):
with open('%s.txt' %n,mode='wt') as f1:
time.sleep(1000)
if __name__ == "__main__":
count=1
while True:
Thread(target=task,args=(count,)).start()
count+=1
time.sleep(3)
[root@egon ~~]# cat test2.py
import os
import time
from threading import Thread
print(os.getpid())
def task(n):
with open('egon%s.txt' %n,mode='wt') as f1:
time.sleep(1000)
if __name__ == "__main__":
count=1
while True:
Thread(target=task,args=(count,)).start()
count+=1
time.sleep(3)
# 测试
[root@egon ~~]# ulimit -n 12 # 最大的文件描述符数为12,每个用户级进程能打开的最大文件数均只有12个
[root@egon ~~]# python test1.py &
[1] 1263
[root@egon ~~]# 1263
[root@egon ~~]# python test2.py &
[2] 1266
[root@egon ~~]# 1266
# 在另外一个终端查看
[root@egon ~~]# ll /proc/1263/fd
总用量 0
lrwx------. 1 root root 64 11月 12 18:18 0 -> /dev/pts/0 # 指向当前终端的标准输入
lrwx------. 1 root root 64 11月 12 18:18 1 -> /dev/pts/0 # 指向当前终端的标准正确输出
lrwx------. 1 root root 64 11月 12 18:18 2 -> /dev/pts/0 # 指向当前终端的标准错误输出
l-wx------. 1 root root 64 11月 12 18:18 3 -> /root/1.txt
l-wx------. 1 root root 64 11月 12 18:18 4 -> /root/2.txt
l-wx------. 1 root root 64 11月 12 18:18 5 -> /root/3.txt
l-wx------. 1 root root 64 11月 12 18:18 6 -> /root/4.txt
l-wx------. 1 root root 64 11月 12 18:18 7 -> /root/5.txt
[root@egon ~~]# ll /proc/1266/fd
lrwx------. 1 root root 64 11月 12 18:18 0 -> /dev/pts/0
lrwx------. 1 root root 64 11月 12 18:18 1 -> /dev/pts/0
lrwx------. 1 root root 64 11月 12 18:18 2 -> /dev/pts/0
l-wx------. 1 root root 64 11月 12 18:18 3 -> /root/egon1.txt
l-wx------. 1 root root 64 11月 12 18:18 4 -> /root/egon2.txt
l-wx------. 1 root root 64 11月 12 18:18 5 -> /root/egon3.txt
l-wx------. 1 root root 64 11月 12 18:18 6 -> /root/egon4.txt
l-wx------. 1 root root 64 11月 12 18:18 7 -> /root/egon5.txt
# 观察1263与1266这俩进程各自一旦打开的文件数目到达了12,就都会报错
[root@egon ~~]# Exception in thread Thread-10:
Traceback (most recent call last):
File "/usr/lib64/python2.7/threading.py", line 812, in __bootstrap_inner
File "/usr/lib64/python2.7/threading.py", line 765, in run
File "test1.py", line 8, in task
IOError: [Errno 24] Too many open files: '10.txt'
Exception in thread Thread-11:
Traceback (most recent call last):
File "/usr/lib64/python2.7/threading.py", line 812, in __bootstrap_inner
File "/usr/lib64/python2.7/threading.py", line 765, in run
File "test1.py", line 8, in task
IOError: [Errno 24] Too many open files: '11.txt'
Exception in thread Thread-10:
Traceback (most recent call last):
File "/usr/lib64/python2.7/threading.py", line 812, in __bootstrap_inner
File "/usr/lib64/python2.7/threading.py", line 765, in run
File "test2.py", line 8, in task
IOError: [Errno 24] Too many open files: 'egon10.txt'
了解:系统级最大的文件描述符个数,即内核程序最大可以打开的文件数
Linux的/proc/sys/fs/file-max决定了当前内核可以打开的最大的文件句柄数。
# 查看当前的值:
cat /proc/sys/fs/file-max
这个值在kernel的文档里是这样描述的:
The value in file-max denotes the maximum number of file handles that the
Linux kernel will allocate. When you get a lot of error messages about running
out of file handles, you might want to raise this limit. The default value is
10% of RAM in kilobytes. To change it, just write the new number into the
file:
意思是file-max一般为内存大小(KB)的10%来计算,如果使用shell,可以这样计算:
grep -r MemTotal /proc/meminfo | awk '{printf("%d",$2/10)}'
一般我们不需要主动设置这个值,因为该值会随着内存大小的变化而自动分配到内存的10%左右,除非这个值确实较小(可能有各种其他原因导致file-max没有设置为内存的10%),我们才需要设置
# 如何查看当前kernel的句柄:
[root@egon ~~]# cat /proc/sys/fs/file-nr
608 0 94306
file-nr在内核文档里得解释如下:
Historically, the three values in file-nr denoted the number of allocated file
handles, the number of allocated but unused file handles, and the maximum
number of file handles. Linux 2.6 always reports 0 as the number of free file
handles -- this is not an error, it just means that the number of allocated
file handles exactly matches the number of used file handles.
过去,filenr中的三个值表示已分配的文件句柄数、已分配但未使用的文件句柄数以及最大文件句柄数。Linux2.6总是报告0作为空闲文件句柄的数量——这不是一个错误,它只是意味着分配的文件句柄的数量与使用的文件句柄的数量完全匹配。
4、永久设置与优化
ulimit命令的设置都是临时生效的,可以了解一下它的一些选项如下
-H选项和-S选项分别表示对给定资源的硬限制(hard limit)和软限制(soft limit)进行设置。
硬限制(hard limit)一旦被设置以后就不能被非root用户修改
软限制(soft limit)可以增长达到硬限制(hard limit)。
硬限制(hard limit)一旦被设置以后就不能被非root用户修改,软限制(soft limit)可以增长达到硬限制(hard limit)
如果既没有指定-H选项也没有指定-S选项,那么硬限制(hard limit)和软限制(soft limit)都会被设置。
ulimit设定的值可以是一个数值,也可以是一些特定的值,比如:hard,soft,unlimited,分别代表当前硬件限制、当前软件限制、不限制。
如果limit参数被省略,除非指定-H选项,否则资源当前的软限制(soft limit)将会被打印出来。
如果既没有指定-H选项也没有指定-S选项,那么硬限制(hard limit)和软限制(soft limit)都会被设置。
若想永久设置,需要修改配置文件
配置文件2:/etc/security/limits.conf,该文件可用于控制用户最多同时打开的进程数目与文件数目
#配置文件介绍
<domain> <type> <item> <value>
<domain>表示要限制的用户
<type>设定类型
<item>表示可选的资源
<value>表示要限制的值
#加大文件描述符与最大打开的进程数
cat >>/etc/security/limits.conf<<EOF
* soft nofile 102400
* hard nofile 102400
* soft nproc 102400
* hard nproc 102400
EOF
#重启查看
[root@egon ~]# ulimit -n # 查看最大打开的文件数目
65535
[root@egon ~]# ulimit -u # 查看最大打开的进程数目
配置文件2:/etc/security/limits.d/20-nproc.conf ,该文件只用于控制用户最多同时打开的进程数目,优先级高于/etc/security/limits.conf,出现冲突后,以自己的为准。
[root@egon ~]# cat /etc/security/limits.d/20-nproc.conf
egon1 soft nproc 3 # 用户egon1最多同时开3个进程
egon2 soft nproc 4 # 用户egon2最多同时开4个进程
* soft nproc 5 # 其他用户最多同时开5个进程
root soft nproc unlimited # root用户无限制
#重启生效,直接切换到egon1、egon2、其他用户里测试即可验证优先级
5、调整Kernel pid max
This file (new in Linux 2.5) specifies the value at which PIDs wrap around (i.e., the value in this file is one greater than the maximum PID). The default value for this file, 32768,results in the same range of PIDs as on earlier kernels. On 32-bit platfroms, 32768 is the maximum value for pid_max. On 64-bit systems, pid_max can be set to any value up to 2^22 (PID_MAX_LIMIT, approximately 4 million).
这个文件(linux2.5中的新文件)指定了PIDs环绕的值(即,这个文件中的值比最大PID大一个)。此文件的默认值32768将产生与早期内核相同的pid范围。在32位平台上,32768是pid最大值。在64位系统上,pid最大值可以设置为2^22等于4194304(pid最大值限制,大约400万)。
默认是
[root@egon ~~]# cat /proc/sys/kernel/pid_max
131072
通常够用,可以酌情调整, 以减少滚动翻转问题
临时 调整为:
echo 4194303 > /proc/sys/kernel/pid_max
永久生效
echo "kernel.pid_max= 4194303" | tee -a /etc/sysctl.conf
sysctl -p
6、调整swappiness
调整swappiness, 主要控制系统对 swap 的使用,这个参数的调整最先见于 UnitedStack 公开的文档中:
swappiness参数值可设置范围在0到100之间。 此参数值越低,就会让Linux系统尽量少用swap分区,多用内存。设置为100可能会影响整体性能,如果内存充足,就可以将这个值设置很低,甚至为0,以避免系统进行swap而影响性能,不建议设置成0,建议设置成10即可,详解请看:https://www.cnblogs.com/linhaifeng/articles/13960093.html
[root@egon ~~]# cat /proc/sys/vm/swappiness
60
[root@egon ~~]# echo "vm.swappiness = 10" | tee -a /etc/sysctl.conf
7、其他内核优化
#设置
[root@egon ~]# cat >>/etc/sysctl.conf<<EOF
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_syn_backlog = 16384
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 = 16384
net.core.netdev_max_backlog = 16384
net.ipv4.tcp_max_orphans = 16384
net.ipv4.ip_forward = 1
EOF
#生效
[root@egon ~]# sysctl -p
syncookies开启后用来防止syn洪水攻击,了解请看https://www.cnblogs.com/linhaifeng/articles/13959796.html
十、网络优化
1、NetworkManager
在CentOS系统上,目前有NetworkManager和network两种网络管理工具。如果两种都配置会引起冲突,而且NetworkManager在网络断开的时候,会清理路由,如果一些自定义的路由,没有加入到NetworkManager的配置文件中,路由就被清理掉,网络连接后需要自定义添加上去。
network:对网卡的配置
NetworkManager:这个服务由几个部分组成;一个是管理系统网络连接;一个是允许用户管理网络连接的客户端程序,使用它可以更好的管理网络
#临时关闭
[root@egon ~]# systemctl stop NetworkManager
#永久关闭
[root@egon ~]# systemctl disable NetworkManager
2、Jumbo frames
万兆网卡MTU=9000,交换机也要设置,而且对端的MTU也要=9000,否则会出错误
最大传输单元,以太网(走arp协议,通过mac通信)内一般为1500,这样发送大文件就需要经过:切片-》发送–》重组。
请看https://www.cnblogs.com/linhaifeng/articles/13959997.html
MTU越小分片数越多,对网络cpu压力都会变大,如果升高MTU值,切片数目就会变小,传输效率会升高,但是为什么MTU最大值为9000字节?
从理论上计算,4 bytes的CRC最大支持12000 bytes大小的字节,超过了就没有办法检查了。另外还有其他一些协议如NFS等的限制。
最后需要注意的是,在经过交换网络设备时,仅仅修改主机端的MTU值是不行的,还需要交换网络设备上开启jumbo frames功能。
3、网卡绑定
网卡绑定bond模式4(lacp),team模式lacp,teamd绑定模式:这个运行程序可用于两种负载平衡,即主动和被动负载平衡。在主动模式中,通过使用最新流量统计不断进行流量再平衡,
以便尽可能平均分配流量。在静态模式中,流量会在可用链接之间随机分配。鉴于较低的处理开销,这样有速度优势。
在高流量应用程序中通常首选此方式,因为流量通常由多个要在可用链接间随机分配的流组成,使用这种方式时,无需 teamd 介入即可完成负载分布。
所有网卡绑定都采用被动模式,既不配置"tx_balancer": {“name”: “basic”}。如果配置为主动模式,会有网路延迟产生,
4、禁用ping
禁止主机被ping。echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
十一、安全优化
Linux系统安全最小原则说明
最小化原则 对Linux系统安全来说极其重要,即多一事不如少一事 。具体包括如下几个方面:
- 安装Linux系统最小化,即选包最小化,yum安装软件包也要最小化,无用的包不装。
- 开机自启动服务最小化,即无用的服务不开启。
- 操作命令最小化。例如:能用“rm-f test.txt”就不用“rm-fr test.txt”。
- 登录Linux用户最小化。平时没有特殊需求不登录root,用普通用户登录即可。
- 普通用户授权权限最小化,即只给用户必需的管理系统的命令。
- Linux系统文件及目录的权限设置最小化,禁止随意创建、更改、删除文件。
1、单用户
进入后输入
chroot /sysroot
然后修改密码
passwd root
# 注意:事先关闭selinux
2、grub加密
centos7.2 + 中引入了新的实用程序“ grub2-setpassword ”
1) 执行 grub2-setpassword 命令
# grub2-setpassword
Enter password:
Confirm password:
2)如果现在重新启动系统并尝试修改引导条目,系统将要求提供凭据,但是可以在没有凭据的情况下修改引导条目。为了阻止未经授权的修改和未经授权的启动,我们需要对 /boot/grub2/grub.cfg 文件进行更改
打开文件并使用密码搜索需要保护的启动条目,它以menuentry开头。找到条目后,从中删除 --unrestricted 参数
3) reboot 重启验证,只有当输入正确的用户名和密码时,才能进入 grub 菜单或者修改引导条目。
3、光盘修复模式
#1、进入bios、从光盘启动
#2、点击Troubleshooting
#3、进入到Troubleshooting界面
选择:Rescue a CentOS Linux system
#4、三:进入到Rescue选项 按 ENTER键 选1 ,其他选项意思如下
1)continue:救援模式程序会自动查找系统中已有的文件系统,并可读写挂载到/mnt/sysimage目录下。
2Linux-Centos7系统配置