來說說 Linux VPS的一些優化方法。那麼如果你是VPS主機(Linux),可以嘗試一下了,尤其是 Linux 系統的內核參數優化。
一、增加SWAP分區
VPS(Virtual Private Server 虛擬專用服務器)技術,將一部服務器分割成多個虛擬專享服務器的優質服務。每個VPS都可分配獨立公網IP地址、獨立操作系統、獨立超大空間、獨立內存、獨立執行程序和獨立系統配置等。
下面是配置過程中的一些筆記:
VPS只有一個根分區,沒有swap交換分區。VPS內存不大,於是,我為其增加了一個swap交換文件。
1、進入一個目錄
BASICcd /var/
2、獲取256M的文件塊:
BASICdd if=/dev/zero of=swapfile bs=1024 count=262144
3、創建swap文件
BASIC/sbin/mkswap swapfile
4、激活swap文件
BASIC/sbin/swapon swapfile
5、查看一下swap是否正確:
BASIC/sbin/swapon -s
6、加到fstab文件中讓系統引導時自動啟動
BASICvi /etc/fstab
在末尾增加以下內容:
BASIC/var/swapfile swap swap defaults 0 0
二、修改Linux系統時區
系統默認為美國東部時間,修改Linux時區為東八區(北京時間)
BASICcp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
三、Linux內核參數優化
Linux內核參數優化可以使用 sysctl 命令完成,但是命令只能臨時生效,若要永久保留配置,我們就得編輯sysctl.conf這個文件了。先附上sysctl.conf詳細參數說明。
sysctl.conf 文件中參數設置及參考推薦值:
proc/sys/net/core/wmem_max
最大socket寫buffer,可參考的優化值:873200
/proc/sys/net/core/rmem_max
最大socket讀buffer,可參考的優化值:873200
/proc/sys/net/ipv4/tcp_wmem
TCP寫buffer,可參考的優化值: 8192 436600 873200
/proc/sys/net/ipv4/tcp_rmem
TCP讀buffer,可參考的優化值: 32768 436600 873200
/proc/sys/net/ipv4/tcp_mem
同樣有3個值,意思是:
net.ipv4.tcp_mem[0]:低於此值,TCP沒有內存壓力.
net.ipv4.tcp_mem[1]:在此值下,進入內存壓力階段.
net.ipv4.tcp_mem[2]:高於此值,TCP拒絕分配socket.
上述內存單位是頁,而不是字節.可參考的優化值是:786432 1048576 1572864
/proc/sys/net/core/netdev_max_backlog
進入包的最大設備隊列.默認是300,對重負載服務器而言,該值太低,可調整到1000
/proc/sys/net/core/somaxconn
listen()的默認參數,掛起請求的最大數量.默認是128.對繁忙的服務器,增加該值有助於網絡性能.可調整到256.
/proc/sys/net/core/optmem_max
socket buffer的最大初始化值,默認10K
/proc/sys/net/ipv4/tcp_max_syn_backlog
進入SYN包的最大請求隊列.默認1024.對重負載服務器,可調整到2048
/proc/sys/net/ipv4/tcp_retries2
TCP失敗重傳次數,默認值15,意味著重傳15次才徹底放棄.可減少到5,盡早釋放內核資源.
/proc/sys/net/ipv4/tcp_keepalive_time
/proc/sys/net/ipv4/tcp_keepalive_intvl
/proc/sys/net/ipv4/tcp_keepalive_probes
這3個參數與TCP KeepAlive有關.默認值是:
tcp_keepalive_time = 7200 seconds (2 hours)
tcp_keepalive_probes = 9
tcp_keepalive_intvl = 75 seconds
意思是如果某個TCP連接在idle 2個小時後,內核才發起probe.如果probe 9次(每次75秒)不成功,內核才徹底放棄,認為該連接已失效.對服務器而言,顯然上述值太大. 可調整到:
/proc/sys/net/ipv4/tcp_keepalive_time 1800
/proc/sys/net/ipv4/tcp_keepalive_intvl 30
/proc/sys/net/ipv4/tcp_keepalive_probes 3
/proc/sys/net/ipv4/ip_local_port_range
指定端口范圍的一個配置,默認是32768 61000,已夠大.
net.ipv4.tcp_syncookies = 1
表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防范少量SYN攻擊,默認為0,表示關閉;
net.ipv4.tcp_tw_reuse = 1
表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認為0,表示關閉;
net.ipv4.tcp_tw_recycle = 1
表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0,表示關閉。
net.ipv4.tcp_fin_timeout = 30
表示如果套接字由本端要求關閉,這個參數決定了它保持在FIN-WAIT-2狀態的時間。
net.ipv4.tcp_keepalive_time = 1200
表示當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時,改為20分鐘。
net.ipv4.ip_local_port_range = 1024 65000
表示用於向外連接的端口范圍。缺省情況下很小:32768到61000,改為1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192
表示SYN隊列的長度,默認為1024,加大隊列長度為8192,可以容納更多等待連接的網絡連接數。
net.ipv4.tcp_max_tw_buckets = 5000
表示系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數字,TIME_WAIT套接字將立刻被清除並打印警告信息。默認為 180000,改為 5000。對於Apache、Nginx等服務器,上幾行的參數可以很好地減少TIME_WAIT套接字數量,但是對於Squid,效果卻不大。此項參數可以控制TIME_WAIT套接字的最大數量,避免Squid服務器被大量的TIME_WAIT套接字拖死。
需要優化的朋友,可以參考上面的參數說明,並根據服務器實際負載來定制你的sysctl.conf文件,下面貼上一個針對nginx內核參數優化的例子,僅供參考(待補充):
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65000
將以上代碼添加到 sysctl.conf 文件的最後,然後執行 /sbin/sysctl -p 即可生效。
三、關閉多余tty,釋放內存
Linux默認會啟動6個TTY控制台,都需要常駐占用內存(1tty占用4M多的樣子),事實上沒必要需要使用這麼多tty,個人vps,僅需1~2個tty即可。
Centos5.* 設置tty數量:
①、編輯 /etc/inittab,找到 tty [1-6] 改成 tty [1-2]
②、編輯 /etc/sysconfig/init,同樣將 tty [1-6] 改成 tty [1-2]
重啟系統即可生效(建議先不重啟,等後續操作完成一起重啟即可);
CentOS 6.* 設置tty數量:
CentOS 6.0 開始 TTY 的配置由 /etc/inittab 更改為 /etc/init/start-ttys.conf,所以上面的第①步變為:
①、編輯 /etc/init/start-ttys.conf,找到 tty [1-6] 改成 tty [1-2]
②同上編輯即可
四、關閉ipv6
ipv6一般都用不到,完全關閉即可。
編輯 /etc/modprobe.d/dist.conf 文件,在最後追加:
BASICalias net-pf-10 off
alias ipv6 off
然後重啟系統即可(某些發行版可能是 /etc/modprobe.conf 文件)。
五、關閉多余啟動項
執行 chkconfig --list | grep :on 列出啟動項:
然後找到不需要啟動的項目,執行 chkconfig 程序名 off 即可。
比如,ip6tables 是 ipv6 防火牆,用不到,執行 chkconfig ip6tables off ,然後執行 service ip6tables stop 即可徹底關閉 ip6tables 這個多余進程。