【IT168 資訊】生產環境下的Linux伺服器有精準、穩定、高效、安全等需求,其優化也是有著很多的竅門。本文分享了九條平時進行Linux生產伺服器優化的經驗,內容涉及郵件伺服器、Web伺服器、網絡配置、內存管理等方面。
一、時間同步
生產環境下的伺服器對時間的要求是精準的,我的郵件伺服器的dovecot服務,以前經常因為時間問題自動停止服務,建議編輯
vim /etc/crontab
至今每天跟ntp時間伺服器自動對時一次:
14 04 * * * root /usr/sbin/ntpdate ntp.api.bz > /dev/null 2>&1
二、啟用內核中的SYN cookie保護:
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
執行以下命令使內核配置立馬生效:
/sbin/sysctl -p
三、Squid伺服器變慢的解決方法
如果自己的生產伺服器是squid緩存伺服器,當發現系統變慢或打開網頁變慢時可輸入下列命令:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
這條命令可以把當前系統的網絡連接狀態分類匯總,由此分析出系統變慢的原因。
Linux下高並發的Squid伺服器,TCP TIME_WAIT套接字數量經常達到兩、三萬,伺服器很容易被拖死。通過修改Linux內核參數,可以減少Squid伺服器的TIME_WAIT套接字數量。
vim /etc/sysctl.conf
增加以下幾行:
net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time = 1200 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.ip_local_port_range = 1024 65000 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_max_tw_buckets = 5000
說明:
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 表示用於向外連接的埠範圍。預設情況下很小,改為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套接字拖死。
執行以下命令使內核配置立馬生效:
/sbin/sysctl -p
四、Nginx伺服器的情況
如果伺服器是Nginx負載均衡器或用於Nginx+PHP5的web伺服器,此二項也必須打開:
net.ipv4.tcp_tw_reuse = 1 #允許將TIME-WAIT sockets重新用於新的TCP連接
net.ipv4.tcp_tw_recycle = 1 #開啟TCP連接中TIME-WAIT sockets的快速回收
執行以下命令使內核配置立馬生效:
/sbin/sysctl -p
五、調整Linux的最大文件打開數
Linux最大文件打開數的默認值很低,必須修改的高一些,否則squid伺服器在高負載時執行性能將很低。
vim /etc/security/limit.conf ,在最後一行添加
* soft nofile 60000 * hard nofile 65535
值得注意的是,通過命令ulimit -SHn是改變不了linux系統的最大文件打開數的,寫進/etc/rc.d/rc.local也是不行的。
六、只開啟必須的服務
只開啟必須的服務,其它均可關閉。以下列出的服務可開啟:
crond irqbalance microcode_ctl network random sshd syslog
iptables這個待定。如果前端有硬體防火牆;這個也可以關閉,反之不行。
下面的命令可檢查運行在5級別的服務,3級以此類推
chkconfig -- list | awk '{print $1 " " $7}' | grep 5:on
檢查下列印服務,此服務經常成漏網之魚,關掉它。
service cups stop chkconfig cups off
chkconfig這條命令會關掉3和5級別的服務。
七、停止ipv6
線上跑的Linux伺服器,絕大多數是64位的CentOS。CentOS默認的狀態下,ipv6是被啟用的狀態。因為我們不使用ipv6,所以,停止ipv6能夠以最大限度保證安全和快速。
vim /etc/modprobe.conf
修改此配置文件,添加如下行到文尾:
alias net-pf-10 off alias ipv6 off echo "IPV6INIT=no" >> /etc/sysconfig/network-scripts/ifcfg-eth0
八、開啟RHEL的網卡激活模式
如果伺服器的系統是RHEL,就需要開啟RHEL默認的網卡激活模式為ONBOOT。感覺這也算是RHEL的一個小bug吧:筆者替客戶維護的某臺RHEL應用伺服器,居然六塊網卡,在ONBOOT關閉的時候,有的啟動,有的不啟動,汗噢。我還特的向客戶諮詢了這個問題,客戶答曰:買多了……
vim /etc/sysconfig/network-scripts/ifcfg-eth0,eth1
eth1為第二網卡,其它依此內推。
ONBOOT=YES
然後重啟網絡服務生效
service network restart
九、Linux內存管理
Linux內存管理模式跟windows不一樣,它的原則是有多少就用多少。很多Linux新手喜歡用命令free -m觀察,發現free所剩無餘後想辦法去優化內存;其實就走進了一個誤區,linux本身的內存模式就很好了,為了提高磁碟存取效率,Linux做了一些精心的設計,除了對dentry進行緩存(用於VFS,加速文件路徑名到inode的轉換),還採取了兩種主要Cache方式:Buffer Cache和Page Cache。前者針對磁碟塊的讀寫,後者針對文件inode的讀寫。這些Cache有效縮短了 I/O系統調用(比如read,write,getdents)的時間。所以,建議,內存管理這塊順其自然吧。