Php

如何將 php5+MySQL 擴展到 200 個請求/秒以上?

  • March 9, 2016

我正在調整我的首頁以提高性能,目前它在 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

  • 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

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