LAMP(Linux+Apache+MySQL+PHP)服務器的性能優化
目前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安裝所有者這些字符集,所以最好的選擇是安裝一兩種你需要的就可以了(中文、英文)。
總結:本文介紹了如何在現有硬件條件下提高系統性能,網絡管理員充分了解自己的計算機和網絡,從而找到真正的瓶頸所在。在預算短缺的今天,理解如何優化系統性能比以往任何時候都重要。一味地硬件投資并不是能夠讓人們接受的辦法 — 并且也不一定生效。
關鍵字:服務器、優化、網絡
新文章:
- CentOS7下圖形配置網絡的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統后丟失windows啟動項
- CentOS單網卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網打印機IP講解
- CentOS7使用hostapd實現無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網絡重啟出錯
- 解決Centos7雙系統后丟失windows啟動項
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統有什么不同呢
- Centos 6.6默認iptable規則詳解