![针对高负载重型应用优化 Web 服务器(apache2+nginx+memcached+eaccelerator)](https://linux22.com/image/576616/%E9%92%88%E5%AF%B9%E9%AB%98%E8%B4%9F%E8%BD%BD%E9%87%8D%E5%9E%8B%E5%BA%94%E7%94%A8%E4%BC%98%E5%8C%96%20Web%20%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%88apache2%2Bnginx%2Bmemcached%2Beaccelerator%EF%BC%89.png)
我有一台服务器(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:GenuineIntel CPU 系列:15 型号:2 型号名称:Intel(R) Pentium(R) 4 CPU 2.40GHz 步进:7 CPU频率:2399.701 缓存大小:512 KB fdiv_bug :否 hlt_bug :否 f00f_bug : 没有 coma_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 博戈米普斯: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 匿名页面:621300 kB 映射:57088 kB 内存:3616 kB 板坯:47800 kB 可回收:35400 kB 取消回收:12400 kB 内核堆栈:2176 kB 页表:4508 kB NFS_不稳定:0 kB 跳出率:0 kB 回写时间:0 kB 提交限制:3173096 kB 已提交:1307224 kB Vmalloc总计:122880 kB 已使用 Vmalloc:41768 kB VmallocChunk:70512 kB 硬件损坏:0 kB 大页面总数:0 HugePages_Free:0 HugePages_Rsvd:0 HugePages_Surp:0 大页面大小:4096 kB DirectMap4k:36856 kB DirectMap4M:868352 kB
目前 magento 的 ApacheBench 显示以下输出
Keefir-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 [#/秒](平均) 每个请求的时间:16854.999 [毫秒](平均) 每个请求的时间:842.750 [毫秒](所有并发请求的平均值) 传输速率:已接收 25.44 [Kbytes/sec] 连接时间(毫秒) 最小平均值[+/-标准差] 中位数 最大值 连接: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)
以下是更大的测试:
Keefir-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 [#/秒](平均) 每个请求的时间:33847.804 [毫秒](平均) 每个请求的时间:846.195 [毫秒](所有并发请求的平均值) 传输速率:已接收 25.34 [Kbytes/sec] 连接时间(毫秒) 最小平均值[+/-标准差] 中位数 最大值 连接: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 保持活动状态 最大KeepAliveRequests 100 KeepAliveTimeout 15 启动服务器 5 最小备用服务器数 5 最大备用服务器数 10 最大客户数 20 每个孩子的最大请求数 0
nginx.conf:
工作进程 1; 事件 { 工作者连接1024; } http { 包括/etc/nginx/mime.types; 默认类型应用程序/八位字节流; 服务器名称哈希桶大小64; 访问日志/var/log/nginx/access.log; 发送文件; #tcp_nopush 开启; #keepalive_timeout 0; 保持活动超时 65; tcp_nodelay开启; 开启 gzip; gzip_proxied任何; gzip_最小长度 1100; gzip_http_版本 1.0; gzip缓冲区4 8k; gzip_comp_level 9; gzip_types 文本/纯文本/css 应用程序/x-javascript 文本/xml 应用程序/xml 应用程序/xml+rss 文本/javascript; 包括/etc/nginx/conf.d/*.conf; 包括/etc/nginx/sites-enabled/*; }
php.ini 中的 eAccelerator:
;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”
答案1
使用该 CPU,TPS/RPS 的最佳数字约为 5。您的硬件较旧,因此您永远无法实现高并发性。但您可以通过改进模板性能(spriting、组合 css/js 等)来缩短页面加载时间。
为了进行测试,暂时放弃 Nginx。由于您纯粹在测试 PHP 吞吐量,因此 Nginx(及其配置)会妨碍您。
专注于 Apache 和 PHP 配置本身。
一些入门提示:
- 增加 PHP 的 SHM 大小(务必先增加 ulimit)
- 禁用 Apache keepalive(使用 Nginx 时,Apache 除了 1 个动态请求外不提供任何其他服务,因此 keepalive 会减慢速度)。
- 使用 Eaccelerator 将压缩级别降低到 7 左右,这会增加 CPU 开销(而您没有)
但说实话,在配备 1.2GB RAM 的 P4 上,你永远不会获得很好的结果 :(