Apache-2.2

針對高負載重應用優化Web Server(apache2+nginx+memcached+eaccelerator)

  • March 12, 2012

我有一個伺服器(Apache2 + nginx 作為反向代理,memcached 記憶體和 eaccelerator)。該應用程序是 Magento - 由於高度模組化和大量 php 文件(5000-10000+),它非常重。

軟體版本:

伺服器版本:Apache/2.2.16 (Debian)
伺服器建成:2011 年 9 月 25 日 22:18:56

PHP 5.3.3-7+squeeze3 和 Suhosin-Patch (cli)

memcached STAT 版本 1.4.5(不是 php 模組)

eaccelerator php 模組 0.9.6.1

中央處理器:

root@grandpa:~# cat /proc/cpuinfo
處理器:0
vendor_id : 正版英特爾
CPU系列:15
型號:2
型號名稱:Intel(R) Pentium(R) 4 CPU 2.40GHz
步進:7
中央處理器兆赫:2399.701
記憶體大小:512 KB
fdiv_bug:沒有
hlt_bug:沒有
f00f_bug:沒有
昏迷錯誤:沒有
fpu:是的
fpu_exception:是的
cpuid 級別:2
wp:是的
標誌: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe up pebs bts cid xtpr
bogomips : 4799.40
clflush 大小:64
記憶體對齊:128
地址大小:36 位物理,32 位虛擬

記憶體

root@grandpa:~# cat /proc/meminfo
記憶體總量:1293792 kB
無記憶體:77980 kB
緩衝區:89776 kB
記憶體:423168 kB
交換記憶體:160 kB
活動:689012 kB
非活動:445392 kB
活動(匿名):443016 kB
非活動(匿名):182060 kB
活動(文件):245996 kB
非活動(文件):263332 kB
不可避免的:0 kB
鎖定:0 kB
高總計:404744 kB
高免費:24676 kB
低總計:889048 kB
低免費:53304 kB
總交換量:2526200 kB
無交換:2525556 kB
臟:816 kB
寫回:0 kB
AnonPages:621300 kB
映射:57088 kB
記憶體:3616 kB
平板:47800 kB
可回收:35400 kB
回收:12400 KB
核心堆棧:2176 kB
頁表:4508 kB
NFS_Unstable:0 kB
反彈:0 kB
寫回時間:0 kB
送出限制:3173096 kB
已送出_AS:1307224 kB
Vmalloc 總計:122880 kB
Vmalloc已使用:41768 kB
VmallocChunk:70512 kB
硬體損壞:0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd:0
HugePages_Surp: 0
巨頁大小:4096 kB
DirectMap4k:36856 kB
DirectMap4M:868352 KB

目前 magento 的 ApacheBench 顯示以下輸出

Kefir-Samolet-iMac: ~ jevgenismirnov $ ab -n 1000 -c 20 -e out.csv http://magento.sv/index.php
這是 ApacheBench,版本 2.3
版權所有 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
授權給 Apache 軟體基金會,http://www.apache.org/

對 magento.sv 進行基準測試(請耐心等待)
已完成 100 個請求
已完成 200 個請求
已完成 300 個請求
完成 400 個請求
已完成 500 個請求
已完成 600 個請求
已完成 700 個請求
已完成 800 個請求
已完成 900 個請求
已完成 1000 個請求
已完成 1000 個請求


伺服器軟體:nginx/1.0.11
伺服器主機名:magento.sv
伺服器埠:80

文件路徑:/index.php
文件長度:21497 字節

並發級別:20
測試時間:842.750 秒
完成請求:1000
失敗的請求:0
寫入錯誤:0
總傳輸量:21955000 字節
傳輸的 HTML:21497000 字節
每秒請求數:1.19 [#/sec](平均)
每個請求的時間:16854.999 [ms](平均值)
每個請求的時間:842.750 [ms](平均值,所有並發請求)
傳輸速率:收到 25.44 [Kbytes/sec]

連接時間(毫秒)
最小值平均值[+/-sd] 中值最大值
連接:0 4694 2456.3 5107 21387
處理:0 12121 2630.6 11442 19787
等待:0 10798 2575.2 10114 18369
總計:4985 16815 1367.8 16471 24861

特定時間內服務的請求百分比(毫秒)
50% 16471
66% 16728
75% 16931
80% 17226
90% 18477
95% 18763
98% 21116
99% 21388
100% 24861(最長請求)

有什麼辦法提高

Requests per second:    1.19 [#/sec] (mean)

和更低

Time per request:       16854.999 [ms] (mean)

這是更大的測試:

Kefir-Samolet-iMac:~ jevgenismirnov $ ab -n 5000 -c 40 -e out.csv http://magento.sv/index.php
這是 ApacheBench,版本 2.3
版權所有 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
授權給 Apache 軟體基金會,http://www.apache.org/

對 magento.sv 進行基準測試(請耐心等待)
已完成 500 個請求
已完成 1000 個請求
已完成 1500 個請求
已完成 2000 個請求
完成 2500 個請求
已完成 3000 個請求
完成 3500 個請求
完成 4000 個請求
完成 4500 個請求
已完成 5000 個請求
完成 5000 個請求


伺服器軟體:nginx/1.0.11
伺服器主機名:magento.sv
伺服器埠:80

文件路徑:/index.php
文件長度:21497 字節

並發級別:40
測試時間:4230.975 秒
完成請求:5000
失敗的請求:0
寫入錯誤:0
總傳輸量:109795470 字節
傳輸的 HTML:107505012 字節
每秒請求數:1.18 [#/sec](平均值)
每個請求的時間:33847.804 [ms](平均值)
每個請求的時間:846.195 [ms](平均,所有並發請求)
傳輸速率:收到 25.34 [Kbytes/sec]

連接時間(毫秒)
最小值平均值[+/-sd] 中值最大值
連接:1 4786 2006.4 5111 37051
處理:0 28979 2955.3 28296 39951
等待:0 27638 2904.5 26962 39950
合計:13425 33765 2189.4 33309 39953

特定時間內服務的請求百分比(毫秒)
50% 33309
66% 33829
75% 34390
80% 34915
90% 36747
95% 37618
98% 37962
99% 38306
100% 39953(最長請求)

apache2.conf(使用prefork,僅更改設置):

超時 300
保持活動狀態
MaxKeepAliveRequests 100
保持活動超時 15


啟動伺服器 5
MinSpareServers 5
MaxSpareServers 10
最大客戶數 20
MaxRequestsPerChild 0

nginx.conf:

worker_processes 1;
事件{
worker_connections 1024;
}
http {
包括/etc/nginx/mime.types;
default_type 應用程序/八位字節流;
server_names_hash_bucket_size 64;
access_log /var/log/nginx/access.log;

發送文件;
#tcp_nopush 開啟;

#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay 開啟;


gzip打開;
gzip_proxied 任何;
gzip_min_length 1100;
gzip_http_version 1.0;
gzip_buffers 4 8k;
gzip_comp_level 9;
gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript;


包括/etc/nginx/conf.d/*.conf;
包括/etc/nginx/sites-enabled/*;
}

來自 php.ini 的 eAccelerator:

; 電子加速器配置
; 請注意,eAccelerator 也可以作為 PHP 擴展或 zend_extension 安裝
; 如果您使用的是 PHP 的執行緒安全建構,則必須使用
; zend_extension_ts 而不是 zend_extension
擴展 =“eaccelerator.so”
eaccelerator.shm_size = "16"
eaccelerator.cache_dir = "/var/cache/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"
eaccelerator.allowed_admin_path = "/var/www/eaccelerator"

使用該 CPU,TPS/RPS 的最佳值約為 5。您擁有舊硬體,因此您永遠不會擁有高並發性。但是您可以通過處理模板性能來降低頁面載入時間(精靈、組合 css/js 等)

為了您的測試,暫時放棄 Nginx。當您純粹是在測試 PHP 吞吐量時,Nginx(及其配置)會妨礙您。

專注於 Apache 和 PHP 配置本身。

一些入門提示:

  1. 增加 PHP 的 SHM 大小(一定要先增加 ulimit)
  2. 禁用 Apache keepalives(Apache 在使用 Nginx 時除了 1 個動態請求之外不提供任何服務,因此 keepalives 會減慢速度)。
  3. 使用 Eaccelerator 將壓縮級別降低到 7 左右,這會增加 CPU 成本(您沒有)

但老實說,在具有 1.2GB RAM 的 P4 上 - 你永遠不會得到很好的結果 :(

引用自:https://serverfault.com/questions/362926