Php
如何將 php5+MySQL 擴展到 200 個請求/秒以上?
我正在調整我的首頁以提高性能,目前它在 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