Linux

SQLSTATEH是000H是000HY000: 一般錯誤: 2006 MySQL server has gone away

  • April 16, 2012

伺服器詳情:

RAM: 16GB
HDD: 1000GB
OS: Linux 2.6.32-220.7.1.el6.x86_64
Processor: 6 Core

請參閱下面的連結以獲取我的 # 頂部預覽:

http://dl.dropbox.com/u/26967109/%23top-1.jpg

我經常可以在我的 plesk 面板中看到標題中提到的錯誤,我的 /etc/my.cnf 配置如下:

bind-address=127.0.0.1
local-infile=0
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql

max_connections=20000
max_user_connections=20000
key_buffer_size=512M
join_buffer_size=4M
read_buffer_size=4M
read_rnd_buffer_size=512M
sort_buffer_size=8M
wait_timeout=300
interactive_timeout=300
connect_timeout=300
tmp_table_size=8M
thread_concurrency=12
concurrent_insert=2
query_cache_limit=64M
query_cache_size=128M
query_cache_type=2
transaction_alloc_block_size=8192
max_allowed_packet=512M

[mysqldump]
quick
max_allowed_packet=512M

[myisamchk]
key_buffer_size=128M
sort_buffer_size=128M
read_buffer_size=32M
write_buffer_size=32M

[mysqlhotcopy]
interactive-timeout

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
open_files_limit=8192

由於我的伺服器 httpd conf 設置為/etc/httpd/conf.d/swtune.conf並且配置如下:在 prefork.c:

<IfModule prefork.c>
StartServers       8
MinSpareServers   10
MaxSpareServers   20
ServerLimit     1536
MaxClients      1536
MaxRequestsPerChild  4000
</IfModule>

如果我跑步,grep -i maxclient /var/log/httpd/error_log那麼我每天都會看到這個錯誤:

[root@u16170254 ~]# grep -i maxclient /var/log/httpd/error_log
[Sun Apr 15 07:26:03 2012] [error] server reached MaxClients setting, consider raising the MaxClients setting
[Mon Apr 16 06:09:22 2012] [error] server reached MaxClients setting, consider raising the MaxClients setting

我試圖解釋我為保持伺服器正常所做的所有更改,但我的伺服器停機的最長時間。請幫助我更改哪個參數以保持伺服器正常並且我的網站可以快速載入。載入我的網站需要太多時間。

哇。

設置MaxClients為 1536 並且每個 Apache 子程序使用大約 69MB 的 RAM,您需要超過 100GB 的 RAM 來避免換出 Apache 記憶體的“熱”部分。我是否可以建議您降低該值,直到它適合您的可用 RAM?像這樣交換會使你的伺服器非常慢。

由於您在同一台伺服器上執行 MySQL,我會為每個服務使用大約一半的可用 RAM,因此MaxClients 115適合您。如果你想在 MySQL 周圍留一點喘息的空間,可能會低一點。

現在,轉到 MySQL,這可能是您的伺服器執行緩慢的實際原因。MySQL 使用大量 CPU 和非常少的 RAM。要做的三件事:

  1. 打開 mysql 慢查詢日誌並將其設置為long_query_time10 或 20 秒之類的高值。慢慢降低該設置,直到您開始擷取慢查詢。一旦您知道哪些查詢導致了問題,請通過添加適當的索引或修改查詢來調整它們。調整查詢是一個主要話題,有幾本很好的書。
  2. 執行 mysqltuner.pl 並遵循它的建議。( wget mysqltuner.pl)
  3. 安裝伺服器性能監控工具,如 Cacti、Munin 或 Zabbix(還有其他選項)並添加“Better Cacti Templates”或“Appaloosa Templates”。

採用上面的“每個服務一半”的想法,mysqltuner.pl將告訴您 MySQL 可以使用的最大 RAM 量,但您不太可能看到這一點,因為它依賴於每個連接的 RAM 分配,您永遠不會看到所有 20,000 個連接允許。相反,觀察 MySQL 實際使用的內容並使其使用大約 2/3 至 3/4 的剩餘 RAM 是一個明智的值。

您可能應該根據您使用的引擎 降低query_cache提高query_cache_limit其中一個key_buffer_size或提高。會有比我更好的建議。innodb_buffer_pool``mysqltuner.pl


您用作此問題標題的錯誤消息與wait_timeoutMySQL 的設置有關。某些程序已打開與 MySQL 的連接,然後在命令之間等待至少 300 秒。如果這是一個 Web 請求,則提高此值不是正確的解決方案。300 秒遠遠超過人們等待網路請求完成的時間。修復導致平均負載如此之高的任何問題(可能是其他慢速查詢和交換),請求會更快。

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