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

Modified on: Fri, 23 Aug 2019 07:20:02 +0800

我正在调整我的主页以获得性能,目前它在3.14.by上处理大约200个请求/秒,其中包含6个SQL查询,以及3.14by/forum上的20个req​​ /秒,这是phpBB论坛。

奇怪的是,在某些VPS和专用的Atom 330服务器上,数字大致相同。

服务器软件如下:Apache2 + mod_php prefork 4个孩子(这里试过不同的数字),php5,APC,nginx,memcached用于PHP会话存储。

MySQL配置为占用大约30%的可用内存(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 强>

  • query_cache_type = 1 - 启用缓存SQL查询。如果设置为2,则只有在将SQL_CACHE提示传递给它们时才会缓存查询。与类型1类似,您可以使用SQL_NO_CACHE提示
  • 为特定查询禁用缓存
  • key_buffer_size = 128M(默认值:8M) - MyISAM表索引的内存缓冲区。在专用服务器上,目标是将key_buffer_size设置为服务器上内存总量的至少四分之一,但不超过一半
  • query_cache_size = 64M(默认值:0) - 查询缓存的大小
  • back_log = 100(默认值:50,最大值: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 - 锁定内存中的进程(以减少交换进入)

的Apache 强>

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

PHP 强>

  • variables_order =“GPCS”(如果您不需要环境变量)
  • register_globals = Off - 除了存在安全风险外,还会对性能产生影响
  • 尽可能减少include_path(避免额外的文件系统查找)
  • display_errors = Off - 禁用显示错误。强烈建议所有生产服务器使用(如果出现问题,不会显示丑陋的错误消息)。
  • magic_quotes_gpc的=关
  • magic_quotes的_ * =关
  • output_buffering =开
  • 尽可能禁用日志记录
  • expose_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

相关问答

添加新评论