LAMP 架構伺服器效能最佳化建議
(03/11/2004,R1版)

出處:http://www.paulgao.com.cn,歡迎轉載。

維護「手機之家」(http://www.imobile.com.cn)的伺服器有快兩年了,也有些經驗心得,寫在這裡給大家分享。

伺服器組態如下:redhat linux 9.0、apache 1.3.29、php 4.3.4、mysql 3.23.58,以下建議均在以上平台上跑的很好,當然也跟你的套用有關係,具體實施要根據實際效果來進行。

1、眾所周知的方法就是使用 Zend Optimizer(簡稱 ZO,最新版本為 2.5.1) 或者 Zend Performance Suite(簡稱 ZPS,其中包含 ZO,最新版本為 3.6.0)對 PHP 進行加速。相關軟體可到張微波的主頁來下載哦,位址為:http://www.5ilinux.com/blog/archives /000093.html。

2、apache組態最佳化(httpd.conf)
1)修改「Timeout」的值為 30-60,如果你得程序沒有執行時間需要很長的話,可以修改到 10-15;
2)修改「KeepAlive」的值為「Off」,這個很有效果,也很有爭議,我自己的看法是很有效果,而且並沒有影響速度,大家可以自行試驗;
3)修改「MaxRequestsPerChild」的值為「2048」,這個還在試驗中,一是因為怕有記憶體洩漏,二是因為 apache 工作會因為隨著服務時間的延長,會變得越來越胖(我這裡的實際情況是某些 apache 工作會狂吃記憶體到18MB,暈啊:),不過這設定有沒有效果,還在試驗中;
4)在不使用 .htaccess 的情況下,將其「<Files .htaccess>」部分設定為「None」方式,如果你使用 PHPMYADMIN 進行管理的話,可以使用 PHPMYADMIN 的 COOKIE 權限控制方式。

3、卸載不必要的模組,不管是靜態編譯還是 DSO 模式,以便節省記憶體佔用。具體模組可以參照 apache 的手冊,這裡就不多說了。PHP 也是同樣,我基本上已經把不用的模組都卸載了:)

4、使用 mod_gzip 進行加速,很簡單,就不多說了。

5、如果你的伺服器還是負載很高的話,更極端的方式就是在 httpd.conf 裡面將日誌停掉了,不過一般要保留 errorlog 才好,以便排錯,而且要記得,不是把「CustomLog」註釋掉就行了,而要使用「CustomLog /dev/null common」這樣的方式才好。

6、如果你的 PHP 程序使用 Session 對話的話,可以在 php.ini 裡面將「session.save_path」設定為「session.save_path = /dev/shm」,因為 /dev/shm 是 linux 系統獨有的 TMPFS 文件系統,是以記憶體為主要儲存於方式的文件系統,比 RAMDISK 要好,因為可以使用 DISKSWAP 作為補充,而且是系統原有的,不需要另行組態,想想吧,從磁牒IO操作到記憶體操作,速度會快多少?:)你也可以把你所需要的臨時文件都寫在 /dev/shm 下,只是別忘了,重啟就沒有啦,我是只存放目標文件的,呵呵。額外的說明資料請看「使用虛擬記憶體(virtual memory,VM)文件系統和綁定安裝」(http://www-900.ibm.com/developerWorks/cn/linux /filesystem/l-fs3/index.shtml)。

7、MYSQL 的最佳化(/etc/my.cnf)
1)驗證在「[mysqld]」部分加入了「skip-innodb」和「skip-bdb」參數;
2)驗證在「[mysqld]」部分加入了「skip-name-resolve」和「skip-locking」參數;
3)如果不需要的話,可以將二進制日誌(binlog)停掉,方法是將「log-bin」註釋掉;
4)在記憶體允許的情況下,對一些參數進行重新組態,目標在於將大部分操作集中於記憶體中,盡量不進行磁牒操作,對於我的 MYSQL 伺服器我是如下修改的,關於 2G 記憶體情況:

[mysqld]
set-variable = key_buffer=512M
set-variable = max_allowed_packet=4M
set-variable = table_cache=1024
set-variable = thread_cache=64
set-variable = join_buffer_size=32M
set-variable = sort_buffer=32M
set-variable = record_buffer=32M
set-variable = max_connections=512
set-variable = wait_timeout=120
set-variable = interactive_timeout=120
set-variable = max_connect_errors=30000
set-variable = long_query_time=1
set-variable = max_heap_table_size=256M
set-variable = tmp_table_size=128M
set-variable = thread_concurrency=8
set-variable = myisam_sort_buffer_size=128M

你可以根據「show status」指令返回的狀態進行微調。我主要注意以下變數的數值,越小越好,最好為零:)
Created_tmp_disk_tables
Created_tmp_tables
Created_tmp_files
Slow_queries

8、在啟動指令碼中使用「--log-slow-queries=/home/logs/mysql_slow.log」參數,以便進行 SQL 語句的最佳化工作,這個其實是很很重要的工作。記得一定要在 my.cnf 中設定「set-variable = long_query_time=1」才行。

9、另外可以使用 4.0.xx 版本的 MYSQL,4.0.xx 版本除了一些效能提升以外,還有 Query快取 方法,就是在 SQL 語句查詢結果沒有變動之前,將其結果進行快取,下次再進去行同樣的 SQL 語句查詢就可以直接反回結果,當然也是以犧牲記憶體為前提:)

10、額外的,對於 LINUX EXT3 文件系統還有一個小技巧可用,就是在修改 /etc/fstab 中的參數,比如「/dev/sdb2 /home ext3 defaults 1 2」改為「/dev/sdb2 /home ext3 noatime 1 2」,「noatime」的意思就是不修改 accesstime,對於磁牒文件讀寫頻繁的伺服器也應該可以降低一些效果。不過最好不要遠端操作,不然因為修改失誤,伺服器不能啟動了,可別怪我:)

好了,基本上我用過的方法已經說過一遍了,有些方法是取自於一些很好的文章,由於未作保留,所以無法寫出出處,只能泛泛的表示感謝了。其中有些方法也 適用於 Windows 平台,大家可以根據自己的伺服器、套用情況去進行套用,大家也可一說說自己的辦法,比如改用 ZEUS 來做 webserver,我也在找更多的辦法來提升伺服器效能,比如關於 LINUX KERNEL v2.4 以上內核的一些效能最佳化方法,從 network 到 swap(因為內核昇級,所以一些老版本內核的方法已經不能再使用了:)。我也會進一步更新這篇文章,讓大家能夠更好的進行伺服器的效能提升工作∼

另外歡迎來訪問國內數一數二的手機網站,手機之家,位址見下,呵呵∼

高春輝
mailto:paulgao@yeah.net
手機之家網站(http://www.imobile.com.cn)

Last modified: Monday, 9 September 2013, 4:26 PM