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

前面,张戈博客在折腾 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 配置:

编辑网站的配置文件,比如 zhangge.net.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 进程:

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端萌媛的成长之路

一波webpack

1924
来自专栏数据和云

MongoDB 初体验:存储引擎 MMAPv1 与高内存消耗及升级迁移

当我对公司的一个内部系统性能无可忍受时,意外发现在这个内存仅为 32G 的服务器上,运行着一个 MongoDB 数据库,其主进程 mongod 占用了 30.7...

2427
来自专栏pythonlove

Linux防火墙iptables(二)

上一篇文章我们说了一些iptables/netfilter的基础知识,本文我们来介绍一下iptables的规则编写。Iptables的规则可以概括的分为两个方面...

3862
来自专栏linux系统运维

原 添加自定义监控项目,配置邮件告警,测

2093
来自专栏白驹过隙

Socket编程回顾,一个最简单服务器程序

2293
来自专栏北京马哥教育

十二条Linux运维面试必备经典笔试/面试题,来挑战一下!

又到了一年一度的秋招,作为运维方向,看了一些面经,收集了一些笔试面试题,总结了一下,贴出来仅供参考,有错误的地方还请指出. 1.Linux设置环境变量 暂时的:...

5149
来自专栏北京马哥教育

万字长文带你OpenStack从入门到放弃

2134
来自专栏james大数据架构

分布式监控系统Zabbix3.2给异常添加邮件报警

  在前一篇 分布式监控系统Zabbix3.2跳坑指南 中已安装好服务端和客户端,此处客户端是被监控的服务器,可能有上百台服务器。监控的目的一个是可以查看历史状...

2799
来自专栏沃趣科技

ASM 翻译系列第二十弹:ASM Internal ASM file number 7

原作者:Bane Radulovic 译者: 郭旭瑞 审核: 魏兴华 DBGeeK社群联合出品 ASM file number 7 ASM元信息7号...

3877
来自专栏北京马哥教育

你所不知道的linux匿名管道知识

豌豆贴心提醒,本文阅读时间5分钟 相信很多在linux平台工作的童鞋, 都很熟悉管道符 '|', 通过它, 我们能够很灵活的将几种不同的命令协同起来完成一件任...

3135

扫码关注云+社区

领取腾讯云代金券