我正在调整我的主页以提高性能,目前它在 3.14.by 上处理大约 200 个请求/秒,它吃 6 个 SQL 查询,在 3.14.by/forum 上处理 20 个请求/秒,这是 phpBB 论坛。
奇怪的是,一些 VPS 和专用 Atom 330 服务器上的数字大致相同。
服务器软件如下:Apache2+mod_php prefork 4 childs(在这里尝试了不同的数字)、php5、APC、nginx、用于 PHP 会话存储的 memcached。
MySQL 被配置为占用大约 30% 的可用 RAM(在 VPS 上约为 150Mb,在专用服务器上为 700Mb)
看起来某处存在瓶颈,不允许我走得更高,有什么建议吗?(即,我知道执行少于 6 个 SQL 会使其更快,但这看起来不像是一个限制因素,因为 sqld 由于缓存查询而在顶部吃不到几个 %)
有没有人测试过踢 preforked apache2 并只留下 nginx+php 更快?
更多基准
Small 40-byte static file: 1484 r/s via nginx+apache2, 2452 if we talk to apache2 directly.
Small "Hello world" php script: 458 r/s via ngin+apache2.
更新: 似乎瓶颈是缓存数据上的 MySQL 性能。带有单个 SQL 的页面显示 354req/sec,具有 6 个 SQL - 180 req/sec。你觉得我可以在这里调整什么?(我可以为 MySQL 分配 100-200Mb)
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
default-character-set=cp1251
collation-server=cp1251_general_cs
skip-character-set-client-handshake
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
skip-external-locking
bind-address = 127.0.0.1
key_buffer = 16M
max_allowed_packet = 8M
thread_stack = 64K
thread_cache_size = 16
sort_buffer_size = 8M
read_buffer_size = 1M
myisam-recover = BACKUP
max_connections = 650
table_cache = 256
thread_concurrency = 10
query_cache_limit = 1M
query_cache_size = 16M
expire_logs_days = 10
max_binlog_size = 100M
[mysqldump]
quick
quote-names
max_allowed_packet = 8M
[mysql]
[isamchk]
key_buffer = 8M
!includedir /etc/mysql/conf.d/
显然,您可以尝试很多。您最好的选择是追踪不使用索引的查询(为那些启用日志)和其他非优化查询的日志。多年来,我已经编制了大量与性能相关的选项列表,因此我在此处包含了一个小子集以供您参考 - 希望对您有所帮助。以下是一些您可以尝试的一般注意事项(如果您还没有尝试过):
MySQL
阿帕奇
PHP
操作系统调整
如果瓶颈不是 CPU,那么它的 IO - 网络或磁盘。所以..你需要看看有多少 IO 正在发生。我不会认为它是网络(除非您使用的是 10mbps 半双工链路,但如果自动检测无法正常工作,则值得检查开关)。
这留下了磁盘 IO,这可能是一个重要因素,尤其是在 VPS 上。使用 sar 或 iostat 查看磁盘,然后在您的磁盘被大量使用时谷歌如何找到更多详细信息。
我会研究使用Nginx ( memcached ) 或Varnish进行缓存。
至少你应该像 SaveTheRbtz 所说的那样使用 Nginx 来服务器静态文件。
由于服务器似乎没有问题,因此负载生成器可能是。尝试在多台机器上运行它。
在我看来,您可能正在达到 Apache 允许的最大连接数。看看您的 Apache 配置。如果您还没有受到 I/O 或内存等其他限制的约束,那么增加服务器限制和最大客户端数应该会有所帮助。查看 mpm_prefork_module 或 mpm_worker_module 的值并进行相应调整以满足您的需求。
这个负载是由工具产生的还是真实世界的负载产生的?
您可能需要检查 memcached。我已经看到它的高连接率问题导致应用程序延迟。
如果使用负载生成器,当你点击一个小的静态页面时会得到什么?
在加载期间,您可能需要检查网络堆栈的 TIME_WAIT 条件。也许你正在填满你的连接队列。
您可以查看大约 100 多个原因和项目,但没有更多信息,我现在只是在猜测。
99% 的此类问题会追溯到数据库。首先确保你的命中索引。如果这不起作用,请开始缓存所有可以缓存的内容。
我建议您(如果可能)使用连接池来保持数据库与您的 Web 应用程序的连接(无需在每次请求时重新连接)。这可以产生巨大的速度差异。
此外,尝试使用 EXPLAIN 分析您的所有查询(为什么不使用 SHOW PROFILE 分析您的查询?)。