LAMP 架構服務器性能優化建議

 LAMP 架構服務器性能優化建議

LAMP 架構服務器性能優化建議

出處:http://www.paulgao.com.cn,歡迎轉載。
  關鍵詞:LINUX、APACHE、PHP、MYSQL、服務器、性能優化、配置優化。

  維護“手機之家”(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 的情況下,將其“”部分設置爲“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/developer ... m/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 版本除了一些性能提升以外,還有 QueryCache 方法,就是在 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:[email protected]
手機之家網站(http://www.imobile.com.cn)


MySQL優化實例

MySQL優化實例
http://kb.discuz.net/index.php?t ... 6%E5%AE%9E%E4%BE%8B


在Apache, PHP, MySQL的體系架構中,MySQL對於性能的影響最大,也是關鍵的核心部分。對於Discuz!論壇程序也是如此,MySQL的設置是否合理優化,直接影響到論壇的速度和承載量!同時,MySQL也是優化難度最大的一個部分,不但需要理解一些MySQL專業知識,同時還需要長時間的觀察統計並且根據經驗進行判斷,然後設置合理的參數。

下面我們瞭解一下MySQL優化的一些基礎,MySQL的優化我分爲兩個部分,一是服務器物理硬件的優化;二是MySQL自身(my.cnf)的優化。

(1) 服務器硬件對MySQL性能的影響

a) 磁盤尋道能力(磁盤I/O),以目前高轉速SCSI硬盤(7200轉/秒)爲例,這種硬盤理論上每秒尋道7200次,這是物理特性決定的,沒有辦法改變。MySQL每秒鐘都在進行大量、複雜的查詢操作,對磁盤的讀寫量可想而知。所以,通常認爲磁盤I/O是制約MySQL性能的最大因素之一,對於日均訪問量在100萬PV以上的Discuz!論壇,由於磁盤I/O的制約,MySQL的性能會非常低下!解決這一制約因素可以考慮以下幾種解決方案:

使用RAID-0+1磁盤陣列,注意不要嘗試使用RAID-5,MySQL在RAID-5磁盤陣列上的效率不會像你期待的那樣快; 拋棄傳統的硬盤,使用速度更快的閃存式存儲設備。經過Discuz!公司技術工程的測試,使用閃存式存儲設備可比傳統硬盤速度高出6-10倍左右。

b) CPU 對於MySQL應用,推薦使用S.M.P.架構的多路對稱CPU,例如:可以使用兩顆Intel Xeon 3.6GHz的CPU。

c) 物理內存對於一臺使用MySQL的Database Server來說,服務器內存建議不要小於2GB,推薦使用4GB以上的物理內存。

(2) MySQL自身因素當解決了上述服務器硬件制約因素後,讓我們看看MySQL自身的優化是如何操作的。對MySQL自身的優化主要是對其配置文件my.cnf中的各項參數進行優化調整。下面我們介紹一些對性能影響較大的參數。

由於my.cnf文件的優化設置是與服務器硬件配置息息相關的,因而我們指定一個假想的服務器硬件環境:

CPU: 2顆Intel Xeon 2.4GHz

內存: 4GB DDR

硬盤: SCSI 73GB

下面,我們根據以上硬件配置結合一份已經優化好的my.cnf進行說明:

# vi /etc/my.cnf
以下只列出my.cnf文件中[mysqld]段落中的內容,其他段落內容對MySQL運行性能影響甚微,因而姑且忽略。

  [mysqld]
  port = 3306
  serverid = 1
  socket = /tmp/mysql.sock
  skip-locking
  # 避免MySQL的外部鎖定,減少出錯機率增強穩定性。
  skip-name-resolve
禁止MySQL對外部連接進行DNS解析,使用這一選項可以消除MySQL進行DNS解析的時間。但需要注意,如果開啓該選項,則所有遠程主機連接授權都要使用IP地址方式,否則MySQL將無法正常處理連接請求!

back_log = 384
指定MySQL可能的連接數量。當MySQL主線程在很短的時間內接收到非常多的連接請求,該參數生效,主線程花費很短的時間檢查連接並且啓動一個新線程。

back_log參數的值指出在MySQL暫時停止響應新請求之前的短時間內多少個請求可以被存在堆棧中。 如果系統在一個短時間內有很多連接,則需要增大該參數的值,該參數值指定到來的TCP/IP連接的偵聽隊列的大小。不同的操作系統在這個隊列大小上有它自己的限制。

試圖設定back_log高於你的操作系統的限制將是無效的。默認值爲50。對於Linux系統推薦設置爲小於512的整數。

     key_buffer_size = 256M
  # key_buffer_size指定用於索引的緩衝區大小,增加它可得到更好的索引處理性能。    對於內存在4GB左右的服務器該參數可設置爲256M或384M。  注意:該參數值設置的過大反而會是服務器整體效率降低!
     max_allowed_packet = 4M
    thread_stack = 256K
    table_cache = 128K
    sort_buffer_size = 6M
查詢排序時所能使用的緩衝區大小。注意:該參數對應的分配內存是每連接獨佔!如果有100個連接,那麼實際分配的總共排序緩衝區大小爲100 × 6 = 600MB。所以,對於內存在4GB左右的服務器推薦設置爲6-8M。

read_buffer_size = 4M
讀查詢操作所能使用的緩衝區大小。和sort_buffer_size一樣,該參數對應的分配內存也是每連接獨享!

join_buffer_size = 8M
聯合查詢操作所能使用的緩衝區大小,和sort_buffer_size一樣,該參數對應的分配內存也是每連接獨享!

     myisam_sort_buffer_size = 64M
    table_cache = 512
    thread_cache_size = 64
    query_cache_size = 64M
指定MySQL查詢緩衝區的大小。可以通過在MySQL控制檯執行以下命令觀察:

# > SHOW VARIABLES LIKE '%query_cache%';
# > SHOW STATUS LIKE 'Qcache%';
# 如果Qcache_lowmem_prunes的值非常大,則表明經常出現緩衝不夠的情況;
如果Qcache_hits的值非常大,則表明查詢緩衝使用非常頻繁,如果該值較小反而會影響效率,那麼可以考慮不用查詢緩衝;Qcache_free_blocks,如果該值非常大,則表明緩衝區中碎片很多。

     tmp_table_size = 256M
    max_connections = 768
指定MySQL允許的最大連接進程數。如果在訪問論壇時經常出現Too Many Connections的錯誤提 示,則需要增大該參數值。

     max_connect_errors = 10000000
    wait_timeout = 10
指定一個請求的最大連接時間,對於4GB左右內存的服務器可以設置爲5-10。

     thread_concurrency = 8
該參數取值爲服務器邏輯CPU數量×2,在本例中,服務器有2顆物理CPU,而每顆物理CPU又支持H.T超線程,所以實際取值爲4 × 2 = 8

    skip-networking
開啓該選項可以徹底關閉MySQL的TCP/IP連接方式,如果WEB服務器是以遠程連接的方式訪問MySQL數據庫服務器則不要開啓該選項!否則將無法正常連接!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章