LAMP(Linux+Apache+MySQL+PHP)伺服器的效能最佳化

來源:互聯網
上載者:User

 

LAMP(Linux+Apache+MySQL+PHP)伺服器的效能最佳化

計世網特約撰稿 曹江華
來源:http://www.ccw.com.cn/server/yyjq/htm2006/20060627_193322.htm

 

目前LAMP (Linux + Apache + MySQL + PHP) 近幾年來發展迅速,已經成為Web 服務器的事實標準。LAMP這個詞的由來最早始於德國雜誌“c't Mag

azine”,Michael Kunze在1990年最先把這些公事包在一起創造了LAMP的縮寫字。這些組件雖然並不是開開始就設計為一起使用的,但是,這些開源軟體都可以很方便的隨時獲得並免費獲得。這就導致了這些組件經常在一起使用。在過去的幾年裡,這些組件的相容性不斷完善,在一起的應用情形變得非常普便。為了改善不同組件之間的協作,已經建立了某些擴充功能。目前,幾乎在所有的Linux發布版中都預設包含了“LAMP stack”的產品。這些產品組成了一個強大的Web應用程式平台。“LAMP stack”中的每一個組件都是一個FOSS(免費或者開源軟體/Free or Open Source Software)的執行個體。FOSS方法的好處有三個方面。第一,FOSS軟體的性質意味著應用程式可以免費下載,能夠讓更廣泛的人們不用付費就可以使用這個應用軟體。這種免費的方式對於廣大使用者特別具有吸引力。這些使用者如果不使用免費的軟體就需要付費購買“專業”的商用軟體工具。這在製作網站方面通常是一種昂貴的步驟。FOSS許可證是開放式的,因此對於基於FOSS技術的應用軟體的使用和限制都非常少。不需要為軟體的發布支付任何許可證費就可以開發和應用基於LAMP的工程。因此,這對業餘愛好者和專業人員都非常有吸引力。FOSS技術(包括LAMP)的增長和使用的主要原因是因為使用者能夠訪問其資源,修複故障和改善應用軟體的效能都非常容易。與開源軟體許可證結合在一起,這種方法為許多企業簡化了開發過程,並且為企業提供了專有軟體或者商業軟體的限制中所沒有的靈活性。本文我們將介紹基於LAMP組合的伺服器的效能最佳化。

一、Linux主機效能最佳化

1.清理伺服器磁碟片段:

不論Linux檔案系統採用什麼檔案格式(ext3、JFS、XFS、ReiserFS )、何種類型的硬碟(IDE 、SCSI),隨著時間的推移檔案系統都會趨向於片段化。ext3、JFS等進階檔案系統可以減少檔案系統的片段化,但是並沒有消除。在繁忙的資料庫伺服器中,隨著時間的過去,檔案片段化將降低硬碟效能,硬碟效能從硬碟讀出或寫入資料時才能注意到。時間長了會發現每個磁碟上確實積累了非常多的垃圾檔案,釋放磁碟空間可以協助系統更好地工作。Linux最好的整理磁碟片段的方法是做一個完全的備份,重新格式化分區,然後從備份恢複檔案。但是對於7×24小時工作關鍵任務伺服器來說是比較困難的。Kleandisk是一個高效的磁碟清理工具,它能把磁碟上的檔案分成不同的"組",比如把所有的"core"檔案歸成一組(Group),這樣要刪除所有core檔案時只要刪除這個組就行了。core檔案是當軟體運行出錯時產生的檔案,它對於軟體開發人員比較有用,對於其他使用者(比如電子郵件伺服器)卻沒有任何意義。因此,如果沒有軟體開發的需要,見到core檔案就可以將其刪除。

2、開啟硬碟DMA

現在使用的IDE硬碟基本支援DMA66/100/133(直接記憶體讀取)但是Linux發行版本安裝後一般沒有開啟,可以/etc/rc.d/rc.local 最後面加上一行: /sbin/hdparm -d1 –x66 -c3 -m16 /dev/hda 這樣以後每次開機,硬碟的 DMA 就會開啟,不必每次手動設定。添加前後你可以使用命令:hdparm -Tt /dev/hda 來測試對比一下。

3、調整緩衝區重新整理參數

Linux核心中,包含了一些對於系統運行態的可設定參數。緩衝重新整理的參數可以通過調整 /proc/sys/vm/bdflush檔案來完成,這個檔案的格式是這樣的:

# cat /proc/sys/vm/bdflush

30 64 64 256 500 3000 60 0 0

每一欄是一個參數,其中最重要的是前面幾個參數。第一個數字是在"dirty"緩衝區達到多少的時候強制喚醒bdflush進程重新整理硬碟,第二個數字是每次讓bdflush進程重新整理多少個dirty塊。所謂dirty塊是必須寫到磁碟中的緩衝塊。接下來的參數是每次允許bd flush將多少個記憶體塊排入閒置緩衝塊列表。 以上值為RHEL 4.0中的預設值。可以使用兩種方法修改:

(1)使用命令

# echo "100 128 128 512 5000 3000 60 0 0">/proc/sys/vm/bdflush

並將這條命令加到/etc/rc.d/rc.local檔案中去。

(2)在/etc/sysctl.conf 檔案中加入如下行:

vm.bdflush = 100 128 128 512 5000 3000 60 0 0

以上的設定加大了緩衝區大小,降低了bdflush被啟動的頻度,VFS的緩衝重新整理機制是Linux檔案系統高效的原因之一。

4、最佳化輸入輸出

I/O程式對Linux系統效能也是相當重要的,網路硬體I/O對伺服器尤其重要。現在大多數Linux伺服器使用10/100 Mb乙太網路。如果有較重的網路負載,則可以考慮千兆乙太網路卡。如果沒有能力購買千兆網卡的話:可以使用多塊網卡虛擬成為一塊網卡,具有相同的IP地址。這項技術,在Linux中,這種技術稱為Bonding。Bonding在Linux2.4以上核心中已經包含了,只需要在編譯的時候把網路裝置選項中的Bonding driver support選中見圖1。當然利用Bonding技術配置雙網卡綁定的前提條件是兩塊網卡晶片集型號相同,並且都具備獨立的BIOS晶片。

圖1 Linux核心的Bonding driver support選項
然後,重新編譯核心,重新起動電腦,執行如下命令:

#ismod bonding

#ifconfig eth0 down

#ifconfig eth1 down

#ifconfig bond0 ipaddress
#ifenslave bond0 eth0
#ifenslave bond0 eth1

現在兩塊網卡已經象一塊一樣工作了。這樣可以提高叢集節點間的資料轉送.bonding對於伺服器來是個比較好的選擇,在沒有千兆網卡時,用兩塊100兆網卡作bonding,可大大提高伺服器到交換器之間的頻寬.但是需要在交換器上設定串連bonding網卡的兩個子口映射為同一個虛擬介面。編輯/etc/modules.conf檔案,加入如下內容,以使系統在啟動時載入Bonding模組。

alias bond0 bonding

options bond0 mode=0

“mode”的值表示工作模式,共有0、1、2和3四種模式,這裡設定為0。Bonding工作在負載平衡(Load Balancing (round-robin))方式下,即兩塊網卡同時工作,這時理論上Bonding能提供兩倍的頻寬。Bonding運行在網卡的混雜(Promisc)模式下,而且它將兩塊網卡的MAC地址修改為一樣的。混雜模式就是網卡不再只接收目的硬體地址是自身MAC地址的資料幀,而是可以接收網路上所有的幀。

5、減少虛擬終端機的數量。

Linux安裝後系統預設是6個虛擬終端機,也就是 CTRL+ALT F1~F6 那六個,作為伺服器使用可以關掉其中四個,只留下 CTRL+ALT F1~F2,大約省下 4 Mbytes 的記憶體,但是這樣一來,X-Window 會從原來的 CTRL+ALT F7 變成 CTRL+ALT F3 。 修改 /etc/inittab 中,將 mingetty 3 ~6 全部加上 # 字型大小 。

6. 關閉一些不用的服務

Linux伺服器在啟動時需要啟動很多系統服務,它們向本地和網路使用者提供了Linux的系統功能介面,直接面嚮應用程式和使用者。提供這些服務的程式是由運行在背景守護進程(daemons)來執行的。守護進程是生存期長的一種進程。它們獨立於控制終端並且周期性的執行某種任務或等待處理某些發生的事件。他們常常在系統引導裝入時啟動,在系統關閉時終止。linux系統有很多守護進程,大多數伺服器都是用守護進程實現的。如Web服務http等。同時,守護進程完成許多系統任務,比如,作業規划進程crond、列印進程lqd等。有些書籍和資料也把守護進程稱作:“服務”。關閉服務方法請查看筆者的文章:深入理解Linux守護進程。鏈結:http://www.ccw.com.cn/server/yyjq/htm2005/20050914_14ND5_1.htm 。

7.使用工具軟體PowerTweak最佳化系統

Powertweak for linux0.99能夠監視你的系統和網路連接,並且可以將你的系統設定為最佳。

軟體首頁: http://linux.powertweak.com/

軟體安裝:

#wegt http://prdownloads.sourceforge.net/powertweak/powertweak-0.99.2-1.i386.rpm;

#wegt http://prdownloads.sourceforge.net/powertweak/powertweak-gtk-0.99.2-1.i386.rpm

#rpm –ivh powertweak-0.99.2-1.i386.rpm

#rpm –ivh powertweak-gtk-0.99.2-1.i386.rpm

其中powertweak-0.99.2-1.i386.rpm是主程式, powertweak-gtk-0.99.2-1.i386.rpm是KDE環境下的圖形前端。程式安裝後會自動添加到主選單的“系統工具中”,運行介面見圖2。

圖-2 powertweak效能最佳化程式

powertweak能夠對X86構架處理器,晶片集,Voodoo等進行最佳化設定的軟體,支援大多數的中央處理器和晶片集,包括Intel,AMD,與Cyrix,內建四種最佳化設定功能,可以自行設定要最佳化的硬體(中央處理器、CD-ROM、PCI匯流排、硬碟、磁碟陣列)、核心(包括日誌、安全、資源)、網路(包括ip、TCP、Core、 ICMP、Unix domain Routing、 Arp 、Token Ring)、虛擬檔案系統、效能記憶體管理(頁面分配、快取、交換分區)。Powertweak是一個強大的系統效能調節軟體。但是對於使用者要求比較高,許多選項要求你對Linux系統比較瞭解才能準確填寫。

關於Apache、PHP、Mysql軟體安裝,我們建議安裝它們的最新版本,並且從源碼安裝程式。雖然很多Linux發行版本(RedHat 、Suse、TurboLinux)有相應的rpm包, 但從源碼編譯安裝程式,會適合自己的機器設定,我們一般會裝到 /usr/local 目錄下,這樣易於管理。安裝過程這裡筆者就不介紹了。

二、Apache伺服器檢測和最佳化

1.Zend Performance Suite簡介

對於Apache要把 PHP 編譯其中,或者採用 DSO (動態共用對象)模式,不要採用 CGI 方式。採用DSO最重要的原因是效率。Apache是模組化設計的,所以它可以載入各種各樣的伺服器端指令碼解譯器來支援動態網頁。但是隨著頁面訪問量的增大,CGI已經不看重負,為了提高效率。所以選擇把最常調用的模組編譯成動態共用對象(DSO)。zend出品的ZendPerformanceSuite,這是一個Apache伺服器的效能測試和最佳化的工具。可以在它的首頁註冊並且免費下載。並且得到一個協議檔案。下載的軟體包中有兩個檔案:主程式:ZendPerformanceSuite-3.6.0a-Linux_glibc21-i386.tar.gz和協議檔案:zend_performance_suite.dat

2.軟體安裝:

gunzip ZendPerformanceSuite-3.6.0a-Linux_glibc21-i386.tar.gz

tar vxf ZendPerformanceSuite-3.6.0a-Linux_glibc21-i386.tar

cp zend_performance_suite.dat /ZendPerformanceSuite-3.6.0

./install

(1)軟體安裝非常簡單只要根據安裝嚮導的提示操作即可,見圖3.

圖3 軟體安裝嚮導

3、Apache伺服器的測試

(1)開啟一個網路瀏覽器輸入:http://www.cjh.com/ZendPerformanceSuite/login.php

然後輸入密碼即可進入軟體的主介面。

(2)ZendPerformanceSuite的主介面分成四部分。見圖4。

圖4 軟體的主介面

ZendPerformanceSuite軟體包括四部分:“Fast Track”、“Console”、“FileView”、“Testing”。Fast Track是測試嚮導、Console是參數設定、FileView 顯示存放的檔案、Testing是測試命令。

(3)參數說明

其中“Console”部分比較重要。這裡介紹一下它的主要選項:見圖-3:

圖5 軟體的“Console”介面

在這個菜單中將要設定Apache伺服器的各項參數:

“Modified File Detection”:自動檢測檔案類型,

“Filepath Identifiction”:全部檔案深度,

“Accelerator memory”:加速記憶體容量,

“Memory Reclaim Threshold”:記憶體回收比例,

“Maximum Accelerated Files”:最大加速檔案數量。

“Extensions For PHP Files”擴充檔案類型,

“Dynamic Caching Enabled”是否支援動態緩衝,

“Maximum Cache Size”最大緩衝容量,

“Minimum Free Diskspace”:最小磁碟空間,

“Maximum Cached File Size”最大快取檔案大小,

“Default Cache Lifetime”預設快取檔案存活時間,

“Default Dynamic Caching Conditions”:預設緩衝狀態,

“Compress Files”是否壓縮檔。根據你的Apache伺服器情況配置“Console”中的參數,就可以測試了,目前ZendPerformanceSuite支援“Performance Test”(效能測試)和“Compression Test”(壓力測試)。

(4)壓力測試

這裡以壓力測試為例,“Console”各項參數填寫後就可以進行測試了,選擇“Testing”菜單進行測試,結果見圖-4。

圖6 Apache伺服器壓力測試結果

可以看到測試資料以圖形的數值兩種方式在圖-4中。效能測試的步驟和壓力測試一樣的,需要說明的是你需要通過修改“Console”菜單中的參數進行多次測試,最後找到符合你的Apache伺服器最佳選項。按“Apply Change”按鈕儲存設定。

Zend Performance Suite 是一個可以大幅度提升Apache運行效率的軟體包!它可以增強伺服器的資料吞吐能力,節省伺服器的資源消費,支援Linux,Solaris和FreeBSD。它可以減小伺服器的負荷,減少頁面的反應時間,減少資料庫的負荷。增大使用者,檔案壓縮。緩衝的靈活配置,應用編程介面功能。

三、加速PHP

1.使用eaccelerator

我們上面的介紹Apache伺服器的最佳化,如果您曾經瀏覽過 PHP 的網頁時,或許會發現:怎麼 PHP 的速度慢慢的,這是怎麼一回事啊?PHP 不是號稱速度上面的反應是很快速的嗎?怎麼會慢慢的呢?這是由於 PHP 的程式碼去調用了太多的函式庫,而這些函式庫每次調用都需要由硬碟讀出來,有沒有辦法提升 PHP 的執行速度啊。如果我們可以將這些在硬碟裡面的函式庫先讀到快取中( Cache ),由於記憶體的速度可比硬碟快多了。如此一來的話,當然可以提升不少速度。這裡我們介紹一款授權在 GPL 上面的可以對 PHP 程式碼進行快取並且予以最佳化的軟體,那就是eaccelerator他的官方網站在:http://www.arnot.info/eaccelerator/ 。目前版本:0.9.3 。

2、軟體下載安裝:

wget http://internap.dl.sourceforge.net/sourceforge/eaccelerator/eaccelerator-0.9.3.tar.bz2
tar jxf eaccelerator-0.9.3.tar.bz2

/usr/local/bin/phpize
./configure --enable-eaccelerator=shared --with-php-config=/usr/local/bin/php-config
make;make install

修改/etc/php.ini檔案,加入以下內容:

extension="/PATH/TO/eaccelerator.so"
eaccelerator.shm_size="16"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

然後建立快存取資料目錄:

mkdir /tmp/eAccelerator

chmod 0777 /tmp/eAccelerator

從新啟動Apache伺服器:

/etc/rc.d/init.d/httpd restart

通過lynx瀏覽器開啟Web頁面查看通過phpinfo()已經可以看到圖7,就表示安裝成功。

圖7 eAccelerator啟用

可以看到:eAccelerator啟用了。下面 使用ab命令:Apache HTTP 伺服器效能測試工具,是一個測試你Apache http伺服器的工具,你可以通過這個工具指定一個單位時間內向apache發出的請求數量來看看你的Apache和機器配合的效能如何。命令如下:

/home/apache/bin/ab -c 20 -n100 –w http://localhost/phpinfo >1.html

-c: 同時向伺服器端發送的請求數目,預設狀態下是一次只執行一個http請求。

-n: 執行一次測試會話的時候所發出的請求數目。

-w:列印輸出結果到HTML表中,預設的表是兩列n行白底黑框 。

ApacheBench)的測試資料的 requests per second (以下簡稱 rps)一項是指每秒伺服器返回的頁面數,經過比較使用了 eAccelerator 後網頁速度明顯加快了。圖8 lynx瀏覽器的 HTML格式測試結果。

圖8 HTML格式測試結果

2.使用Zend Optimizer

Zend Optimizer用最佳化代碼的方法來提高PHP 4.0應用程式的執行速度。實現的原理是對那些在被最終執行之前由運行編譯器(Run-Time Compiler)產生的代碼進行最佳化。一般情況下,執行使用Zend Optimizer的PHP程式比不使用的要快40%到100%。這意味著網站的訪問者可以更快的瀏覽網頁,從而完成更多的事務,創造更好的客戶滿意度。更快的反應同時也意味著可以節省硬體投資,並增強網站所提供的服務。所以,使用Zend Optimizer,就等於提高了電子商務的盈利能力。Zend Optimizer能給PHP使用者帶來很多益處,特別是那些運營網站的人。快速運行PHP程式可以顯著降低伺服器的CPU負載,並可以減少一半的反應時間,也就是從訪問者點選連結到伺服器開始讀取頁面之間的時間。

Zend Optimizer安裝是傻瓜化的,安裝嚮導會自動根據你的選擇來修改php.ini協助你啟動這個引擎。

軟體下載安裝:

wget http://downloads.zend.com/optimizer/3.0.0/ZendOptimizer-3.0.0-linux-glibc21-i386.tar.gz

gunzip ZendOptimizer-3.0.0-linux-glibc21-i386.tar.gz

tar vxf ZendOptimizer-3.0.0-linux-glibc21-i386.tar

cd ZendOptimizer-3.0.0-linux-glibc21-i386

./install

圖 9 Zend Optimizer安裝嚮導

從新啟動Apache伺服器:

/etc/rc.d/init.d/httpd restart

開啟Web頁面查看通過phpinfo()已經可以看到圖,就表示Zend Optimizer安裝成功。

圖 10 Zend Optimizer安裝成功

然後可以使用ab命令進行再次測試。也可以使用Siege(http://www.joedog.org/siege/ )進行測試,它是一個壓力測試和評測工具,設計用於WEB開發這評估應用在壓力下的承受能力:可以根據配置對一個WEB網站進行多使用者的並發訪問,記錄每個使用者所有請求過程的相應時間,並在一定數量的並發訪問下重複進行。

四、Mysql最佳化

對於程式開發人員而言,目前使用最流行的兩種後台資料庫即為MySQL and SQL Server。這兩者最基本的相似之處在於資料存放區和屬於查詢系統。如果你想建立一個.NET伺服器體系,這一體系可以從多個不同平台訪問資料,參與資料庫的管理,那麼你可以選用SQL Server伺服器。如果你想建立一個第三方動態網站,從這一網站可以從一些用戶端讀取資料,那麼MySQL將是一個不錯的選擇。

1、編譯和安裝MySQL

通過你的系統挑選可能最好的編譯器,你通常可以獲得10-30%的效能提高。在Linux/Intel平台上,用pgcc(gcc的奔騰晶片最佳化版)編譯MySQL。然而,二進位代碼將只能運行在Intel奔騰CPU上。 對於一種特定的平台,使用MySQL參考手冊上推薦的最佳化選項。用你將使用的字元集編譯MySQL。 靜態編譯產生mysqld的執行檔案(用--with-mysqld-ldflags=all-static)並用strip sql/mysqld整理最終的執行檔案。 注意,既然MySQL不使用C++擴充,不帶擴充支援編譯MySQL將贏得巨大的效能提高。

2、最佳化表

MySQL擁有一套豐富的類型。應該對每一列嘗試使用最有效類型。ANALYSE過程可以協助你找到表的最優類型:SELECT * FROM table_name PROCEDURE ANALYSE()。對於不儲存NULL值的列使用NOT NULL,這對你想索引的列尤其重要。 將ISAM類型的表改為MyISAM。用固定的表格式建立表。

3、正確使用索引

索引用來快速地尋找那些具有特定值的記錄,所有MySQL索引都以B-樹的形式儲存。如果沒有索引,執行查詢時MySQL必須從第一個記錄開始掃描整個表的所有記錄,直至找到符合要求的記錄。如果表有1000個記錄,通過索引尋找記錄至少要比順序掃描記錄快100倍。
假設我們建立了一個名為people的表:

CREATE TABLE people ( peopleid SMALLINT NOT NULL, name CHAR(50) NOT NULL );

然後,我們完全隨機把1000個不同name值插入到people表。

但是索引也是有缺點的,首先,索引要佔用磁碟空間。通常情況下,這個問題不是很突出。但是,如果你建立每一種可能列組合的索引,索引檔案體積的增長速度將遠遠超過資料檔案。如果你有一個很大的表,索引檔案的大小可能達到作業系統允許的最大檔案限制。如果MySQL能估計出它將可能比掃描整張表還要快時,則不使用索引。另外,對於需要寫入資料的操作,比如DELETE、UPDATE操作,索引會降低它們的速度。這是因為MySQL不僅要把改動資料寫入資料檔案,而且它還要把這些改動寫入索引檔案。

4、 減少使用字元集編譯MySQL

MySQL目前提供多達24種不同的字元集(許多語言版本),為全球使用者以他們自己的語言插入或查看錶中的資料。預設情況下,MySQL安裝所有者這些字元集,所以最好的選擇是安裝一兩種你需要的就可以了(中文、英文)。

總結:本文介紹了如何在現有硬體條件下提高系統效能,網路系統管理員充分瞭解自己的電腦和網路,從而找到真正的瓶頸所在。在預算短缺的今天,理解如何最佳化系統效能比以往任何時候都重要。一味地硬體投資並不是能夠讓人們接受的辦法 — 並且也不一定生效。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.