AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 113188
Accepted
BarsMonster
BarsMonster
Asked: 2010-02-16 16:02:46 +0800 CST2010-02-16 16:02:46 +0800 CST 2010-02-16 16:02:46 +0800 CST

如何将 php5+MySQL 扩展到 200 个请求/秒以上?

  • 772

我正在调整我的主页以提高性能,目前它在 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/
performance php apache-2.2 nginx
  • 8 8 个回答
  • 16637 Views

8 个回答

  • Voted
  1. Best Answer
    Ivan Peevski
    2010-02-23T13:58:55+08:002010-02-23T13:58:55+08:00

    显然,您可以尝试很多。您最好的选择是追踪不使用索引的查询(为那些启用日志)和其他非优化查询的日志。多年来,我已经编制了大量与性能相关的选项列表,因此我在此处包含了一个小子集以供您参考 - 希望对您有所帮助。以下是一些您可以尝试的一般注意事项(如果您还没有尝试过):

    MySQL

    • query_cache_type=1 - 缓存 SQL 查询已打开。如果设置为 2,则仅在将 SQL_CACHE 提示传递给查询时才缓存查询。与类型 1 类似,您可以使用 SQL_NO_CACHE 提示禁用特定查询的缓存
    • key_buffer_size=128M (default: 8M) - MyISAM 表索引的内存缓冲区。在专用服务器上,旨在将 key_buffer_size 设置为服务器上内存总量的至少四分之一,但不超过一半
    • query_cache_size=64M (default: 0) - 查询缓存的大小
    • back_log=100 (default: 50, max: 65535) - 未完成的连接请求队列。只有在短时间内有很多连接时才重要
    • join_buffer_size=1M(默认值:131072)- 进行全表扫描(无索引)时使用的缓冲区
    • table_cache=2048(默认值:256)- 应该是 max_user_connections 乘以最重的 SQL 查询包含的最大 JOIN 数。在高峰时间使用“open_tables”变量作为指导。还要查看“opened_tables”变量 - 它应该接近“open_tables”
    • query_prealloc_size=32K(默认值:8K)- 用于语句解析和执行的持久内存。如果有复杂的查询增加
    • sort_buffer_size=16M(默认值:2M) - 有助于排序(ORDER BY 和 GROUP BY 操作)
    • read_buffer_size=2M(默认值:128K) - 有助于顺序扫描。如果有许多顺序扫描,则增加。
    • read_rnd_buffer_size=4M - 帮助 MyISAM 表在排序后加快读取速度
    • max_length_for_sort_data - 要存储的行大小,而不是排序文件中的行指针。可以避免随机表读取
    • key_cache_age_threshold=3000(默认值:300)- 将密钥缓存保留在热区的时间(在降级为暖区之前)
    • key_cache_division_limit=50(默认值:100) - 启用更复杂的缓存驱逐机制(两个级别)。表示要为底层保留的百分比。delay_key_write=ALL - 每次索引更新时不会为表刷新键缓冲区,但仅在表关闭时才刷新。这大大加快了键的写入速度,但是如果您使用此功能,您应该通过使用 --myisam-recover=BACKUP,FORCE 选项启动服务器来添加对所有 MyISAM 表的自动检查
    • memlock=1 - 锁定内存中的进程(以减少换入/换出)

    阿帕奇

    • 更改生成方法(例如更改为 mpm)
    • 尽可能禁用日志
    • AllowOverride None - 尽可能禁用 .htaccess。如果未使用 .htaccess 文件,它会停止 apache 查找文件,因此它会保存文件查找请求
    • SendBufferSize - 设置为操作系统默认值。在拥塞的网络上,您应该将此参数设置为接近正常下载的最大文件的大小
    • KeepAlive 关闭(默认开启) - 并安装 lingerd 以正确关闭网络连接并且速度更快
    • DirectoryIndex index.php - 保持文件列表尽可能简短和绝对。
    • 选项 FollowSymLinks - 简化 Apache 中的文件访问过程
    • 避免使用 mod_rewrite 或至少使用复杂的正则表达式
    • 服务器令牌=产品

    PHP

    • variables_order="GPCS" (如果您不需要环境变量)
    • register_globals=Off - 除了存在安全风险外,它还会影响性能
    • 保持 include_path 尽可能小(避免额外的文件系统查找)
    • display_errors=Off - 禁用显示错误。强烈推荐用于所有生产服务器(出现问题时不会显示难看的错误消息)。
    • magic_quotes_gpc=关闭
    • magic_quotes_*=关闭
    • output_buffering=开启
    • 如果可能,禁用日志记录
    • 暴露_php=关闭
    • register_argc_argv=关闭
    • always_populate_raw_post_data=关闭
    • 将 php.ini 文件放在 php 会首先查找的位置。
    • session.gc_divisor=1000 或 10000
    • session.save_path = "N;/path" - 对于大型网站,请考虑使用它。将会话文件拆分为子目录

    操作系统调整

    • 使用 -o noatime 选项(无访问时间)挂载使用过的硬盘。还要将此选项添加到 /etc/fstab 文件中。
    • 调整 /proc/sys/vm/swappiness(从 0 到 100)以查看最佳结果
    • 使用 RAM 磁盘 - mount --bind -ttmpfs /tmp /tmp
    • 29
  2. gbjbaanb
    2010-02-16T16:10:58+08:002010-02-16T16:10:58+08:00

    如果瓶颈不是 CPU,那么它的 IO - 网络或磁盘。所以..你需要看看有多少 IO 正在发生。我不会认为它是网络(除非您使用的是 10mbps 半双工链路,但如果自动检测无法正常工作,则值得检查开关)。

    这留下了磁盘 IO,这可能是一个重要因素,尤其是在 VPS 上。使用 sar 或 iostat 查看磁盘,然后在您的磁盘被大量使用时谷歌如何找到更多详细信息。

    • 1
  3. Espennilsen
    2010-02-18T00:02:03+08:002010-02-18T00:02:03+08:00

    我会研究使用Nginx ( memcached ) 或Varnish进行缓存。

    至少你应该像 SaveTheRbtz 所说的那样使用 Nginx 来服务器静态文件。

    • 1
  4. OliverS
    2010-02-18T00:18:13+08:002010-02-18T00:18:13+08:00

    由于服务器似乎没有问题,因此负载生成器可能是。尝试在多台机器上运行它。

    • 1
  5. Erik Giberti
    2010-02-18T14:03:48+08:002010-02-18T14:03:48+08:00

    在我看来,您可能正在达到 Apache 允许的最大连接数。看看您的 Apache 配置。如果您还没有受到 I/O 或内存等其他限制的约束,那么增加服务器限制和最大客户端数应该会有所帮助。查看 mpm_prefork_module 或 mpm_worker_module 的值并进行相应调整以满足您的需求。

    服务器限制 512
    最大客户数 512
    
    • 1
  6. jeffatrackaid
    2010-02-18T19:56:17+08:002010-02-18T19:56:17+08:00

    这个负载是由工具产生的还是真实世界的负载产生的?

    您可能需要检查 memcached。我已经看到它的高连接率问题导致应用程序延迟。

    如果使用负载生成器,当你点击一个小的静态页面时会得到什么?

    在加载期间,您可能需要检查网络堆栈的 TIME_WAIT 条件。也许你正在填满你的连接队列。

    您可以查看大约 100 多个原因和项目,但没有更多信息,我现在只是在猜测。

    • 0
  7. Konrad
    2010-02-23T11:45:10+08:002010-02-23T11:45:10+08:00

    99% 的此类问题会追溯到数据库。首先确保你的命中索引。如果这不起作用,请开始缓存所有可以缓存的内容。

    • -1
  8. Kedare
    2010-02-23T11:55:44+08:002010-02-23T11:55:44+08:00

    我建议您(如果可能)使用连接池来保持数据库与您的 Web 应用程序的连接(无需在每次请求时重新连接)。这可以产生巨大的速度差异。

    此外,尝试使用 EXPLAIN 分析您的所有查询(为什么不使用 SHOW PROFILE 分析您的查询?)。

    • -1

相关问题

  • 上线的第一天:如何不杀死您的网站

  • IIS 优化

  • mod_rewrite 不转发 GET 参数

  • 更改 PHP 的默认配置设置?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve