1. 程式人生 > 其它 >升級CentOS6.5核心,開啟Nginx的fastopen和reuseport特性

升級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 程序:

實際檢視,也並沒有佔用系統記憶體或其他資源,看了一些老外論壇相關說明,也沒得出一個所以然來,所以先視而不見吧!