Centos5.5最小化安裝後的優化

購買了服務器(現在主流配置都是雙四核),下一步就要安裝系統了。這裏推薦用64位的Centos5.5,安裝系統時我們要選擇最小化安裝(不要圖 形)。大家在用服務器時要記得一個原則,系統的安裝包越少越好,這樣機器纔會更穩定。前面已經介紹過線上服務器的分區流程,如果遇到對磁盤I/O調用頻繁 的服務(例如MySQL),我們可以單獨拿一個分區(如/data)出來,不要跟/裝在一起,避免/分區被頻繁調用,出現I/O瓶頸。至於單服務器的性能 調優,本着穩定安全的原則,儘量不要改動系統原有的配置(Centos自身的文件和內存機制就很優秀),尤其是線上環境,穩定性要放在第一位來考慮。

1.關閉不需要的服務

衆知周知,服務越少,系統佔用的資源也會越少,所以應關閉不需要的服務。這樣做的好處是減少內存和CPU時間的佔用。命令如下所示:# ntsysv下面列出需要啓動的服務,未列出的服務一律關閉。

  • crond
    Linux下的時間計劃任務服務。
  • irqbalance
    啓用irqbalance服務,既可以提升性能,又可以降低能耗。irqbalance用於優化中斷分配,它會自動收集系統數據以分析使用模式,並依據系 統負載狀況將工作置於Performance mode或Power-save mode狀態。處於Performance mode時,irqbalance會將中斷儘可能均勻地分發給各個CPU core,以充分利用CPU的多核,提升性能。處於Power-save mode時,irqbalance會將中斷集中分配給第一個CPU,以保證其他空閒CPU的睡眠時間,降低能耗。現在的主流服務器都是雙四核,所以這項我 建議保留。
  • network
  • sshd
  • syslog
    這是Linux的日誌系統,必須要啓動,否則機器出現問題時會找不到原因。

再說一下兩個比較特殊的服務,它們是iptables和SELinux。因爲網站和系統之前均有硬件防火牆,如果沒有特殊需求的話,均可選擇關閉。要關閉它們可以在命令setup下操作,也可以使用命令行操作。

關閉iptables的代碼如下:service iptables stop && #chkconfig iptables off關閉SELinux的方法如下:vim /etc/selinux/config然後將文件中的selinux=""改爲disabled,並重啓。如果不想重啓系統,使用命令 setenforce 0,此命令可以暫時關閉SELinux,重啓後失效。

說明 setenforce 1將SELinux設置成爲enforcing模式;setenforce 0將SELinux設置成爲permissive模式。

另外,在lilo或grub的啓動參數中增加:selinux=0,這樣也可以關閉SELinux。

2.關閉不需要的tty

先編輯/etc/inittab,找到如下一段命令:
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

這段命令會使init爲你打開了6個控制檯,分別可以用[ALT+F1]到[ALT+F6]進行訪問。此6個控制檯默認都駐留在內存中,用ps -aux這個命令就可以看到,這是6個進程,如下所示:
[root@localhost ~]# ps -aux| grep tty
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ
root   3219 0.0 0.0  3792  488 tty1   Ss+ Mar16  0:00 /sbin/mingetty tty1
root   3220 0.0 0.0  3792  484 tty2   Ss+ Mar16  0:00 /sbin/mingetty tty2
root   3221 0.0 0.0  3792  488 tty3   Ss+ Mar16  0:00 /sbin/mingetty tty3
root   3222 0.0 0.0  3792  488 tty4   Ss+ Mar16  0:00 /sbin/mingetty tty4
root   3224 0.0 0.0  3792  488 tty5   Ss+ Mar16  0:00 /sbin/mingetty tty5
root   3226 0.0 0.0  3792  488 tty6   Ss+ Mar16  0:00 /sbin/mingetty tty6
root   3325 0.0 0.1 90548 6264 tty7   Ss+ Mar16  0:01 /usr/bin/Xorg :0 -br -audit 0 -auth /var/gdm/:0.Xauth -nolisten tcp vt7
root   6767 0.0 0.0 68284 1564 tty8   Ss+ Mar17  0:00 /bin/bash
root   31179 0.0 0.0 63372  756 pts/2  S+  17:03  0:00 grep tty

事實上沒有必要使用這麼多。應如何關閉不需要的進程呢?通常我們保留前兩個控制檯就可以了,把後面4個用#註釋掉,並且無需重啓,只需要執行init q這個命令即可,如下所示:
init q

3.對TCP/IP網絡參數進行調整

調整TCP/IP網絡參數,可以增強抗SYN Flood的能力,命令如下所示:
# echo 'net.ipv4.tcp_syncookies = 1' >> /etc/sysctl.conf
# sysctl -p

4.修改shell命令的history記錄個數

修改history記錄的命令如下所示:
# vi /etc/profile

找到histsize=1000,將其改爲histsize=100(這條可根據實際情況而定)。

不重啓系統就可讓其生效,如下所示:
source /etc/profile

5.定時校正服務器的時間

我們可以定時校正服務器的時間,命令如下所示:
# yum install ntp
# crontab -e

加入如下一行:
*/5 * * * * ntpdate ntp.api.bz

#ntp.api.bz是一組NTP服務器集羣,目前有6臺服務器。這項服務是api.bz繼http://sms.api.bz移動飛信免費短信發送接口之後的第二項免費API服務。

6.停止打印服務

如果不準備提供打印服務,可停止默認設置爲自動啓動的打印服務,命令如下所示:
[root@sample ~]#/etc/rc.d/init.d/cups stop ← 停止打印服務Stopping cups:    [OK]  ← 停止服務成功,出現“OK”
[root@sample ~]#chkconfig cups off ← 禁止打印服務自動啓動
[root@sample ~]#chkconfig -list cups ← 確認打印服務自啓動設置狀態
cups0:off 1:off 2:off 3:off 4:off 5:off 6:off ← 0~6都爲off的狀態就OK(當前打印服務自啓動被禁止)

7.停止ipv6

在Centos5.5默認的狀態下,ipv6是被啓用的。因爲我們不使用ipv6,所以,可以停止ipv6,以最大限度地保證安全和快速。首先確認一下ipv6是不是處於被啓動的狀態。[root@sample ~]#ifconfig -a ← 列出全部網絡接口信息
eth0 Link encap:Ethernet HWaddr 00:0C:29:B6:16:A3
inet addr:192.168.0.13 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:feb6:16a3/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:84 errors:0 dropped:0 overruns:0 frame.:0
TX packets:93 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:10288 (10.0 KiB) TX bytes:9337 (9.1 KiB)
Interrupt:185 Base address:0×1400

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame.:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:952 (952.0 b) TX bytes:952 (952.0 b)
sit0 Link encap:IPv6-in-IPv4 ← 確認ipv6是被啓動的狀態
NOARP MTU:1480 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame.:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

然後修改相應配置文件,停止ipv6,如下所示:
[root@sample ~]#vi /etc/modprobe.conf ← 修改相應配置文件,添加如下內容
alias net-pf-10 off
alias ipv6 off
echo "IPV6INIT=no" >> /etc/sysconfig/network-scripts/ifcfg-eth0
[root@sample ~]#shutdown -r now ← 重新啓動系統,使設置生效

最後確認ipv6的功能已經被關閉,如下所示:

[root@sample ~]#ifconfig -a ← 列出全部網絡接口信息
eth0 Link encap:Ethernet HWaddr 00:0C:29:B6:16:A3
inet addr:192.168.0.13 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:feb6:16a3/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:84 errors:0 dropped:0 overruns:0 frame.:0
TX packets:93 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:10288 (10.0 KiB) TX bytes:9337 (9.1 KiB)
Interrupt:185 Base address:0×1400lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:12 errors:0 dropped:0 overruns:0 frame.:0
TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:952 (952.0 b) TX bytes:952 (952.0 b)

確認ipv6的相關信息沒有被列出,說明ipv6功能已經關閉。

8.調整Linux的最大文件打開數

要調整一下Linux的最大文件打開數,否則squid在高負載時執行性能將會很低。另外,在Linux下面部署應用時,有時候會遇上 Socket/File:Can’t open so many files這樣的問題,這個值也會影響服務器的最大併發數。其實Linux是有文件句柄限制的,但默認不是很高,一般是1024,生產服務器很容易就會達 到這個值,所以需要改動此值。剛開始我採用vim/etc/security/limit.conf命令,在最後一行添加如下代碼:
* soft nofile 60000
* hard nofile 65535

但重啓後一切都還原了。

正解做法應該爲在Centos5.5的/etc/rc.local文件裏添加如下命令行:
ulimit -SHn 65535

當然了,我們也可以在Nginx的一些監控腳本里實時添加此命令行,達到重啓也能生效的目的。

另外,ulimit -n命令並不能真正看到文件的最大文件打開數,大家可用如下腳本查看:
#!/bin/bash
for pid in 'ps aux |grep nginx |grep -v grep|awk '{print$2}''
do
cat /proc/${pid}/limits |grep 'Max open files'
done

9.啓動網卡

大家配置Centos5.5的網卡時,容易忽略的一項就是Linux啓動時未啓動網卡,其後果很明顯,那就是你的Linux機器永遠也沒有IP地址,下面是一臺線上服務器的配置:[root@localhost ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
# Intel Corporation 82541GI Gigabit Ethernet Controller
DEVICE=eth0
BOOTPROTO=none
HWADDR=00:14:22:1B:71:20
IPV6INIT=yes
IPV6_AUTOCONF=yes
ONBOOT=yes →此項一定要記得爲yes,它會在系統引導就啓動你的網卡設備
NETMASK=255.255.255.192
IPADDR=203.93.236.146
GATEWAY=203.93.236.129
TYPE=Ethernet
PEERDNS=yes →允許從DHCP處獲得的DNS覆蓋本地的DNS
USERCTL=no~ →不允許普通用戶修改網卡

10.關閉Centos5.5的寫磁盤I/O功能

一個Linux文件默認有3個時間。

  • atime:對此文件的訪問時間。
  • ctime:此文件inode發生變化的時間。
  • mtime:此文件的修改時間。

如果有多個小文件(比如Web服務器的頁面上有多個小圖片),通常就沒有必要記錄文件的訪問時間了,這樣可以減少寫磁盤的I/O。這要如何配置呢?

首先,修改文件系統的配置文件:vim /etc/fstab。然後,在包含大量小文件的分區中使用noatime和nodiratime這兩個命 令。例如:/dev/sda5 /data/pics ext3 noatime,nodiratime 0 0這樣文件被訪問時就不會再產生寫磁盤的I/O了。

1.5.3 優化Linux下的內核TCP參數以提高系統性能

內核的優化跟服務器的優化一樣,應本着穩定安全的原則。下面以64位的Centos5.5下的Squid服務器爲例來說明,待客戶端與服務器端建立 TCP/IP連接後就會關閉SOCKET,服務器端連接的端口狀態也就變爲TIME_WAIT了。那是不是所有執行主動關閉的SOCKET都會進入 TIME_WAIT狀態呢?有沒有什麼情況使主動關閉的SOCKET直接進入CLOSED狀態呢?答案是主動關閉的一方在發送最後一個ACK後就會進入 TIME_WAIT狀態,並停留2MSL(Max Segment LifeTime)時間,這個是TCP/IP必不可少的,也就是“解決”不了的。

TCP/IP的設計者如此設計,主要原因有兩個:

  • 防止上一次連接中的包迷路後重新出現,影響新的連接(經過2MSL時間後,上一次連接中所有重複的包都會消失)。
  • 爲了可靠地關 閉TCP連接。主動關閉方發送的最後一個ACK(FIN)有可能會丟失,如果丟失,被動方會重新發FIN,這時如果主動方處於CLOSED狀態,就會響應 RST而不是ACK。所以主動方要處於TIME_WAIT狀態,而不能是CLOSED狀態。另外,TIME_WAIT並不會佔用很大的資源,除非受到攻 擊。

在Squid服務器中可輸入查看當前連接統計數的命令,如下所示:

netstat -n| awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
LAST_ACK 14
SYN_RECV 348
ESTABLISHED 70
FIN_WAIT1 229
FIN_WAIT2 30
CLOSING 33
TIME_WAIT 18122

  • CLOSED:無連接是活動的或正在進行中的。
  • LISTEN:服務器在等待進入呼叫。
  • SYN_RECV:一個連接請求已經到達,等待確認。
  • SYN_SENT:應用已經開始,打開一個連接。
  • ESTABLISHED:正常數據傳輸狀態。
  • FIN_WAIT1:應用說它已經完成。
  • FIN_WAIT2:另一邊已同意釋放。
  • CLOSING:兩邊同時嘗試關閉。
  • TIME_WAIT:另一邊已初始化一個釋放。
  • LAST_ACK:等待所有分組死掉。

也就是說,這條命令可以把當前系統的網絡連接狀態分類彙總。

在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_syncookies = 1
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_syncookies=1表示開啓SYN Cookies。當出現SYN等待隊列溢出時,啓用cookie來處理,可防範少量的SYN攻擊。默認爲0,表示關閉。
  • net.ipv4.tcp_tw_reuse=1表示開啓重用。允許將TIME-WAIT套接字重新用於新的TCP連接。默認爲0,表示關閉。
  • net.ipv4.tcp_tw_recycle=1表示開啓TCP連接中TIME-WAIT套接字的快速回收。默認爲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套接字拖死。

執行以下命令使內核配置立即生效:
/sbin/sysctl -p

如果是用於Apache或Nginx等的Web服務器,或Nginx的反向代理,則只需要更改以下幾項即可:
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65000執行以下命令使內核配置立即生效: /sbin/sysctl -p如果是郵件服務器,則建議內核方案如下:net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 5000 65000
kernel.shmmax = 134217728

執行以下命令使內核配置立即生效:
/sbin/sysctl -p

當然這些都只是最基本的更改,大家還可以根據自己的需求來更改內核的設置,同樣也要本着穩定的原則,如果服務器不穩定的話,一切工作和努力都會白 費。如果以上優化仍無法滿足你的要求,有可能你需要定製你的服務器內核或升級服務器硬件。至於服務的配置優化,超出了本章的內容,大家可根據自己的需求有 針對性地進行更改。

1.5.4 生產服務器應儘量選擇編譯安裝軟件包

建議在安裝線上的生產服務器軟件包時都用源碼安裝,這是因爲源碼安裝可以自行調整編譯參數,最大化地定製安裝結果。這裏以MySQL 5線上環境的編譯安裝來說明之,其編譯參數如下所示:
./configure -prefix=/usr/local/mysql -without-debug -without-bench -enable-thread-safe-client -enable-assembler -enable-profiling -with-mysqld-ldflags=-all-static -with-client-ldflags=-all-static -with-charset=latin1 -with-extra-charset=utf8,gbk -with-innodb -with-csv-storage-engine -with-federated-storage-engine -with-mysqld-user=mysql -without-embedded-server -with-server-suffix=-community -with-unix-socket-path=/usr/local/mysql/sock/mysql.sock && make && make install

在安裝MySQL時,源碼安裝與rpm安裝相較,其特點如下:

  • 我們可以針對自己的硬件平臺選用合適的編譯器來優化編譯後的二進制代碼。
  • 根據不同的軟件平臺環境調整相關的編譯參數(源碼安裝不僅適用於rhel/centos,其他系統像FreeBSD、Solaris、Ubuntu等一樣適用)。
  • 可針對特定的應用場景選擇需要什麼組件或不需要什麼組件。
  • 同一臺主機上可以安裝多個MySQL(rpm安裝則僅能安裝一個MySQL)。
  • 根據需要存儲的數據內容選擇只安裝需要的字符集。

理論上源碼靜態編譯方式安裝效率會高一點,但到底比rpm方式高多少得看具體情況,一般在5%左右。

某次在線上環境工作,我用yum卸載一個軟件包時遇到了極其危險的情況,這裏也跟大家分享一下:當時,yum remove自動卸載了許多這個軟件包自身依賴的系統包,導致系統崩潰了,SSH不能登錄,並且SCP及RSYNC也都不能用了,幸虧FTP命令還能用, 所以數據很快被FTP傳到其他服務器上了,但系統已經徹底崩潰,只有重裝了。如果是源碼安裝的軟件包就沒有這種危險,需要卸載時只需要刪除軟件包安裝的目 錄即可。

綜上所述,源碼安裝的好處如下:

  • 最大的好處就是可以自行調整編譯參數,最大化地定製安裝結果。
  • 源碼安裝可以選擇最新的軟件包,而Linux系統(包括FreeBSD)自帶的軟件包一般都是最穩定的版本,但不能保證是最新的。
  • 相對而言,源碼安裝的性能是最優異的。
  • 源碼包安裝的軟件卸載時極爲方便和簡單,更重要的是,它比較安全,尤其是對線上的生產環境而言。
  • 遷徙也比較方便,如果不涉及系統庫文件,複製到另一臺機器上也可以使用。

這裏也簡單介紹一下在Linux/Unix下安裝軟件的源碼三部曲,在後面我們會經常看到它們的身影。
./configure
make
make install

./configure是用來檢查環境變量及配置編譯選項的,make是用來將源代碼編譯成二進制文件的,而make install則會將make編譯出來的文件安裝到指定位置(或默認位置)。

發佈了77 篇原創文章 · 獲贊 1 · 訪問量 2612
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章