这里不敢说 linux优化奥义,主要是本文比较浅显,适合普通开发相关人员去读
linux作为服务器系统的王者,以稳定性著称,但对于不同的“应用场景”,相关配置还需调整,才能保证业务稳定性。以下是相关总结
- IO优化
IO优化通常在需要进行大量文件读写,或进行大量网络请求的情况,如数据库服务器,中间件服务,文件存储服务器,或承担高并发的基础服务的服务器等。根据实际业务情况进行调整
1.文件读写频率的调整,需要的实时性越高,以下3项需要设置得越小,CPU消耗越多。需要的性能越高,以下3项需要设置越大(根据机器配置),CPU消耗越多。
#调整文件 触发刷写脏页的百分比
echo 1 > /proc/sys/vm/dirty_background_ratio
#多久检查一次脏页 秒
echo 1 > /proc/sys/vm/dirty_ratio
#多久后算脏页 此处100ms
echo 100 > /proc/sys/vm/dirty_expire_centisecs
taps:很多数据库采用mmap等有自己的优化配置,这些参数配置就没用了
2. 单进程的文件打开数(如不够用会报xxx openfiles)
#查看现有配置
less /etc/security/limits.conf
#调整配置 这里还可以优化其他参数 如打开进程数等,与命令ulimit -a 中内容相呼应
vim /etc/security/limits.conf
# 将如下内容贴到底部
# 限制文件打开数据
* hard nofile 65535
* soft nofile 65535
sysctl -p 刷一下,重新登录ssh,用命令 ulimit -n 查看是否生效(相关程序也需要重启)
- 内存优化
内存优化。一般情况不建议内存优化,特别是OOM机制,是系统级别的兜底机制,否则真卡住,只能去机房了,如果机房在贵州山里面就很麻烦了哈哈哈
1. 虚拟内存。如果应用实时要求性很高,建议关闭虚拟内存,毕竟拿磁盘当内存,硬件就差了。他作用在于处理一些内存不够的情况,提高程序的极值,如“离线计算类”应用,可以将虚拟内存开大
#查看交换空间
swapon -s
#调整大小
[root@localhost ~]# free -mh
total used free shared buff/cache available
Mem: 3.7G 3.0G 253M 8.4M 433M 459M
Swap: 3.9G 264K 3.9G
#创建一个1M*1024的文件夹 ,根据实际情况调整
[root@localhost ~]# dd if=/dev/zero of=/tmp/big_swap bs=1M count=1024
记录了1024+0 的读入
记录了1024+0 的写出
1073741824字节(1.1 GB)已复制,0.337149 秒,3.2 GB/秒
#统计大小
[root@localhost ~]# du -sh /tmp/big_swap
1.0G /tmp/big_swap
[root@localhost ~]# mkswap /tmp/big_swap
正在设置交换空间版本 1,大小 = 1048572 KiB
无标签,UUID=80241833-60b5-4613-83e7-e5715355d35b
#标记为交换区
[root@localhost ~]# swapon /tmp/big_swap
swapon: /tmp/big_swap:不安全的权限 0644,建议使用 0600。
#查看大小,增加了1G
[root@localhost ~]# free -mh
total used free shared buff/cache available
Mem: 3.7G 3.0G 146M 8.4M 552M 470M
Swap: 4.9G 264K 4.9G
2.cgroup。 严格来说叫内存管控,也是docker的底层原理。设置一个cgroup文件。cgroup其实是个完整的资源管理体系,cd /sys/fs/cgroup 发现里面有很多文件,这里说内存:如下图创建了一个文件,内容是 byte数
系统程序时采用 cgexec -g memory:memory_limit/xxx_limit 开始,加入当前组就行
至于内存分配页等来说,不建议随便优化,以免适得其反。
- 网络优化
首先确认大部分应用基于TCP,不是UDP,此处忽略UDP的优化。此处TCP原理就不说了
打开文件 vim /etc/sysctl.conf
#很需要调整的 队列不够长的时候,并发一上来,就开始拒绝连接 默认1024
net.ipv4.tcp_max_syn_backlog=10240
#很需要调整的 已连接的队列,当握手完成后,会放到这个队列 也是并发过多时会出现的问题,比如断了网,客户端端会自动重试,可能1k个客户端每个重试3次,就是3k个请求直接打过来,此处太小就直接拒绝了连接 默认是128
net.core.somaxconn=10240
# 客户端无响应的超时时间。默认60 不建议改,但要知道,方便查问题
net.ipv4.tcp_fin_timeout=60
#tcp快速打开功能,改功能适合频繁断开连接的情况,而且需客户端配合,虽是银剑,但场景偏少 0禁用 1启用 2启用并解释数据
net.ipv4.tcp_fastopen=0
#一般不用改 在连接建立过程中,发送 SYN(同步)包后等待对方响应的最大重试次数,网络环境很差就可以设置多些
net.ipv4.tcp_syn_retries=6
#一般不用改 是否重用time_wait的连接 默认不重用,当业务代码很健壮的时候可以开,性能提高不少
net.ipv4.tcp_tw_reuse=0
修改之后通过sysctl -p刷写。(然后建议重启程序)
还有其他相关参数未列出,但找到入口就好办了
- 整体参数说明
如需要进行较深入的优化,通过sysctl -a 查看linux的所有内核参数,根据实际情况进行优化