2

升级CentOS6.5内核,开启Nginx的fastopen和reuseport特性

 2 years ago
source link: https://zhang.ge/5098.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Jager · 5月7日 · 2016年linux内核优化 · nginx配置 695次已读

前面,张戈博客在折腾Nginx的SSL优化时,注意到前人在Nginx的listen配置中,添加了 fastopen=3 reuseport 这2个参数。

于是脑补了下,原来是启用Nginx对TCP_FASTOPEN和TCP_SO_REUSEPORT新特性的支持,至于有什么好处,请自行脑补下-->传送门

一、必要环境

当我依葫芦画瓢也添加这2个参数时,报错了:

nginx: [emerg] invalid parameter "fastopen=3" in ***

继续脑补了下,发现系统必须支持 TCP_FASTOPEN和TCP_SO_REUSEPORT,然后重新编译Nginx加入如下参数:

--with-cc-opt=-DTCP_FASTOPEN=23

TCP_SO_REUSEPORT特性在kernel-2.6.32-431.29.2及kernel-3.9被启用,CentOS
6用户可以通过更新内核到2.6.32-431或更高版本来支持这项特性。

这个非常简单,直接yum -y update就行了。

关于TCP_FASTOPEN特性在kernel-3.6被客户端支持,在kernel-3.7被服务端支持,也就是说使用TCP_FASTOPEN需要CentOS 6更新内核至3.7或更高版本,以便支持这项特性。

——摘自kn007的个人博客

二、升级内核

1、方式选择

看了下前人的分享,Centos内核升级一般有2种方式:编译安装或利用EPEL的yum源在线升级

在我看来,下载源码编译安装,不但步骤繁琐,而且容易出错,简直是小白的克星,而yum在线升级不易出错且步骤简单,简直是懒人必选良方,因此这里就只分享yum在升级方案,如果不是centos,就只能自己去找下源码编译的教程了。

在yum的ELRepo源中,有 mainline(3.13.1)、 long- term(3.10.28)这2个内核版本,考虑到long-term更稳定,会长期更新,所以选择这个版本。

2、导入public key

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

3、安装ELRepo到CentOS-6.5中

rpm -ivh http://www.elrepo.org/elrepo-release-6-5.el6.elrepo.noarch.rpm

4、安装 kernel-lt(lt=long-term)

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

Ps:如果是安装kernel-ml(ml=mainline版本),则把上述代码中的 kernel-lt 改为 kernel-ml。

5、确认Grub引导顺序

一般来说,新安装的内核映像会位于第一位,所以只要检查grub.conf中的default值是否指向新装内核即可,比如我的系统:

#编辑grub配置文件
vim /etc/grub.conf
# grub.conf generated by anaconda
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/sda3
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0 #一般最新升级的内核映像位于第一位,所以这里保证 default=0即可!
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (3.10.101-1.el6.elrepo.x86_64) #最新3.10.101内核也就是这个了!
root (hd0,0)
kernel /vmlinuz-3.10.101-1.el6.elrepo.x86_64 ro root=UUID=6e3dc2ee-2daf-48a7-96e4-8b7ca821c23c rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-3.10.101-1.el6.elrepo.x86_64.img
title CentOS (2.6.32-573.22.1.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-573.22.1.el6.x86_64 ro root=UUID=6e3dc2ee-2daf-48a7-96e4-8b7ca821c23c rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-573.22.1.el6.x86_64.img
title CentOS (2.6.32-431.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=6e3dc2ee-2daf-48a7-96e4-8b7ca821c23c rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-431.el6.x86_64.img

6、启用特性

编辑 /etc/sysctl.conf ,插入  net.ipv4.tcp_fastopen = 3,执行如下命令即可:

echo "net.ipv4.tcp_fastopen = 3" >>/etc/sysctl.conf

搞定一切之后,我们重启系统完成此次内核升级。

——以上参考自 《使用yum快速升级CentOS 6.5内核到 3.10.28 | 原作者:健富的博客

三、重新编译

接下来,我们需要重新编译我们的Nginx或Tengine,新增 --with-cc-opt=-DTCP_FASTOPEN=23

1、先查看当前Nginx的编译参数:

#执行 nginx -V 命令
...其他略...
configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module

2、新增开启FASTOPEN参数,重新编译Nginx参数为:

./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-cc-opt=-DTCP_FASTOPEN=23

Ps:就是在原有的参数上新增  --with-cc-opt=-DTCP_FASTOPEN=23 ,重新编译前面已经分享过具体操作,这里就不赘述了,不会的朋友请参考:Nginx在线服务状态下平滑升级或新增模块的详细操作记录

3、重新编译,修改Nginx的listen配置:

编辑网站的配置文件,比如zhang.ge.conf,找到listen,然后再结尾分号前面新增 fastopen=3 reuseport参数,比如:

listen 80 fastopen=3 reuseport;

如果使用的是Tengine,这个配置就会报错:

nginx: [emerg] invalid parameter "reuseport" in ****

最后了解到,Tengine关于reuserport的配置并不是在Listen,而是放到 events 模块。

所以,如果是Tengine,那么编辑nginx.conf主配置文件,找到events模块,如下新增 reuse_port on; 参数:

events
use epoll;
worker_connections 51200;
multi_accept on;
reuse_port on; #新增参数

然后,在网站的listen处新增 fastopen=3 :

listen 80 fastopen=3;

最后,reload重载Nginx即可,这样就不会报错了。

四、其他记录

升级内核,并启用了Nginx新特性之后,并没有进行深入的压力测试,所以本文无法给出优化后的各项性能数据,也不知道具体有多少提升,感兴趣的朋友可以自己开启,然后压测看看。

不过,升级内核后,系统多了200+rcuos和rcuob进程:

实际查看,也并没有占用系统内存或其他资源,看了一些老外论坛相关说明,也没得出一个所以然来,所以先视而不见吧!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK