本文正在参与 “性能优化实战记录”话题征文活动
性能问题理论概述
系统的性能是指操作系统完成任务的有效性,稳定性和响应速度,例如在linux上面搭建一个web服务,可能会出现网页无法打开,打开速度慢等现象,遇到这些问题,有人说linux系统不好,但实际上并不是这样。操作系统完成一个任务,与系统自身的设置,网络拓扑结构,网络连接,接入策略等等多个环节有关,任何一个环节出现问题,都会影响整个系统的性能。当出现问题后,应从应用程序,操作系统,网络环境等方面综合排查,找出问题,然后解决。
在应用程序,操作系统,网络环境等方面,影响最大的是应用程序和操作系统两个方面,因为这两个方面出现问题不易察觉,隐蔽性很强。
系统硬件资源
cpu
cpu是操作系统运行的根本,cpu的速度与性能很大程度决定了系统的性能,因此cpu数量越多,主频越高,服务器性能就更好,但并非这样。
目前大部分cpu在大部分时间内只能运行一个线程,超线程处理器可以处理可以在同一时间可以执行多个线程,可以利用超线程处理特征提高性能。在linux系统下,只有运行SMP内核才能支持超线程,但是安装的cpu数量越多,超线程获得的性能的提高就越少。
可能出现cpu瓶颈的有db服务器,动态web服务器,对于这类应用,要把cpu的性能和配置放在主要位置
内存
内存的大小也是影响linux性能的一个重要因素,内存太小,系统进程会被阻塞,内存太大,资源浪费。
数据服务器,缓存服务器等,对于这类应用,要把内存大小放在首位。
磁盘I/O
磁盘I/O的性能直接影响应用程序的性能。如今通过磁盘RAID技术来提高I/O的性能。
内核参数的优化
centos7内核优化
在默认参数下。linux对高并发支持并不好,主要受制于单线程最大打开文件的限制,内核tcp参数方面和i/o事件分配机制等
iptables参数
如非必须,关闭或者卸载iptables防火墙,并阻止kernel加载iptables模块,这些模块影响高并发性能
单线程最大打开文件
一般的发行版最大打开文件的限制是1024,但是实际是不够的
# ulimit -n 65535
将root启动的单一进程的最大的打开文件数设置为65535,如果系统回显类似于"Operationnotpermitted"之类的话说明上述修改失败。实际上是因为在中指定的数值超过了linux系统对该用户打开文件的软限制或者硬限制,因此需要修改linux系统对于用户打开文件的软限制或者硬限制
- 第一步,修改limits.conf文件,并添加
#vim /etc/security/limits.conf
*softnofile 65535
*hard nofile65535
其中‘*’是表示修改所用用户的限制,soft 和hard指定要修改的事软限制和硬限制,65535表示想要修改的新的限制值,即最大打开文件限制数,(注意软限制要求小于或者等于硬限制)修改完后保存文件
- 第二步,修改/etc/pam.d/login文件,在文件中添加如下行(如果没有这个文件直接
ulimit -n
查看,就可以看到修改的,不用执行这一步)
vim /etc/pan.d/login
sessionrequired/lib/security/pam_limits.so
这是告诉linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制,而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值,修改完后,保存文件。
- 第三步,查看linux最大打开文件数限制
cat /proc/sys/fs/file-max
32568
这表明linux最大打开文件32568个文件,是linux系统硬限制,通常是linux启动时根据系统硬件资源计算出来的最大限制,没有特殊需求,不建议修改。修改此硬限制的方法是修改/etc/sysctl.conf
文件内file-max=131072
修改完后保存文件
完成上述步骤后,重启系统,ulimit -n
查看修改的打开文件数
通过上述步骤就,就为支持高并发tcp连接处理的通讯处理程序解除关于打开文件数量方面的系统限制。
内核tcp参数方面
linux下,tcp连接断开后,会以TIME_WAIT状态保存一段时间,然后才会释放端口,当请求过多时,会产生大量的TIME_WAIT状态的连接,不及时断开的话,会占用大量的资源,我们可以优化tcp内核参数,来即使将TIME_WAIT状态的端口清理掉
本方法只对大量拥有TIME_WAIT状态的系统有效,如果不是效果不太明显,可使用netstat
命令查看
编辑配置文件/etc/systcl.conf
,加入如下内容
vim /etc/systcl.conf
net/ipv4/tcp_syncookies=1 #表示开启SYNcookies,当出现SYN等待队列溢出时,启用cookies来处理,可防范少量的SYN攻击,默认为0,表示关闭
net/ipv4/tcp_tw_reuse=1 #表示开启重用,允许将处于TIME-WAIT状态的socket(TIME-WAIT的端口)用于新的TCP连接 默认为0表示关闭。
net/ipv4/tcp_fin_timeout=30 #修改默认TIME OUT时间为30秒
输入下面的参数让内核参数生效
sysctl-p
经过修改,会进一步提升服务器的负载能力,还能防御少量的syn攻击,和dos攻击
如果本身连接很多,可以优化一下tcp的使用端口范围
I/O事件分配
在linux启用高并发tcp连接,必须确认应用程序是否使用了合适的网络I/O技术和I/O事件分配机制,可用的I/O机制有:同步I/O,异步I/O非阻塞同步I/O。在高tcp并发下,如果使用同步I/0,会严重阻塞程序的运行,除非为每个tcp连接的I/O创建一个线程,过多的线程对线程的调度造成巨大的开支。因此不使用同步I/O。
异步I/O技术AIO
非阻塞同步I/O技术包括:select();poll();epoll等机制,select()支持的并发连接数量有限(1024以内),poll()采取轮训机制,效率相当低,可能存在分配不均,
而如果使用epoll()或AIO没有上述问题
综上所述,尽量使用epoll()或AIO技术来实现高并发tcp连接上的I/O控制。
以上配置仅供参考,实际情况根据工作进行调整观察。