2015-03-03 91 views
13

在問這個問題之前,我已經完成了很多的閱讀工作,所以讓我先說我沒有用完連接,內存或者cpu,我可以告訴,我也沒有用完文件描述符。通過mysql.sock在重負載下的PHP/MYSQL連接失敗

這裏的PHP拋出什麼我當MySQL是在重負載下:

無法通過套接字「/var/lib/mysql/mysql.sock」(11「資源連接到本地MySQL服務器暫時不可用「)

這種情況在負載下隨機發生 - 但是我按的越多,php越頻繁地向我拋出這個。發生這種情況時,我總是可以通過控制檯本地連接,並通過127.0.0.1從PHP連接到本地,而不是使用速度更快的unix套接字的「localhost」。

下面的幾個系統變量淘汰的常見問題:

cat /proc/sys/fs/file-max = 4895952 
lsof | wc -l = 215778 (during "outages") 

可用連接的最高使用率:26%(1000分之261)

InnoDB緩衝池/數據大小:10.0G/3.7G(充足ö室)

  • 軟NOFILE 999999
  • 硬NOFILE 999999

我實際運行MariaDB的(服務器版本:10.0.17-MariaDB的MariaDB的服務器)

這些結果都在正常負載下產生的,並在非工作時間運行mysqlslap,因此,查詢速度慢是不是一個問題 - 高連接。

有什麼建議嗎?我可以報告額外的設置/數據,如果有必要 - mysqltuner.pl說一切都好 -

並再次,這裏揭示的事情是通過IP連接工作得很好,在這些中斷快 - 我只是不能找出原因。

編輯:這裏是我的my.ini(一些值可能似乎從我最近的故障排除的變化有點高了,請記住,有在MySQL日誌中沒有錯誤,系統日誌,或dmesg的)

socket=/var/lib/mysql/mysql.sock 
skip-external-locking 
skip-name-resolve 
table_open_cache=8092 
thread_cache_size=16 
back_log=3000 
max_connect_errors=10000 
interactive_timeout=3600 
wait_timeout=600                        
max_connections=1000 
max_allowed_packet=16M 
tmp_table_size=64M 
max_heap_table_size=64M 
sort_buffer_size=1M 
read_buffer_size=1M 
read_rnd_buffer_size=8M 
join_buffer_size=1M 
innodb_log_file_size=256M 
innodb_log_buffer_size=8M 
innodb_buffer_pool_size=10G 

[mysql.server] 
user=mysql 

[mysqld_safe] 
log-error=/var/log/mysqld.log 
pid-file=/var/run/mysqld/mysqld.pid 
open-files-limit=65535 
+0

什麼是你的磁盤I/O是怎樣的?如果你的瓶頸沒有被內存,CPU或連接命中,它最有可能與加載時的磁盤I/O無法跟上.sock相關。你有沒有嘗試過使用套接字? – user3036342 2015-03-03 10:14:17

+0

在我絕對最糟糕的時候,仍然有0%的iowait(並且html頁面服務很好,速度很快,控制檯速度很快等,所以不是磁盤IO問題) - 我可以嘗試不使用本地套接字 - 但這隻會導致網絡問題引入一堆更多的加載已經繁忙的服務器的TCP堆棧。我寧願留在本地套接字的更快和推薦的方法。 – 2015-03-03 10:19:06

+0

它是一個可能的錯誤。試着改變你的版本 – 2015-03-05 13:27:26

回答

7

最有可能是由於net.core.somaxconn 什麼是在尚未連接隊列/proc/sys/net/core/somaxconn

net.core.somaxconn 

# The maximum number of "backlogged sockets". Default is 128. 

連接的價值。該隊列之上的任何內容都將被拒絕。我懷疑你的情況。嘗試根據您的負載增加它。

以根用戶身份運行

echo 1024 > /proc/sys/net/core/somaxconn 
+0

它被設置爲4096,我昨天改變了它,當我發現它發佈爲php-fpm/nginx問題的解決方案與本地插座。現在流量很低,我有機會再試一次,我發現錯誤消失了!我會爲此獎勵你的賞金,因爲我相信你是對的!這很可能是罪魁禍首,謝謝! – 2015-03-07 14:09:32

+1

這是改變設置的最終名單關於net.core: net.core.somaxconn = 4096 net.core.netdev_max_backlog = 4096 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 – 2015-03-07 14:14:05

+0

好知道你的問題是固定的。謝謝 – 2015-03-07 15:14:35

0

這是可以並且應該通過分析解決的事情。學習如何做到這一點是一項非常棒的技巧。

分析發現在重負載下發生的事情......查詢次數,執行時間應該是您的第一步。確定負載,然後進行適當的db配置設置。您可能會發現您需要優化sql查詢!

然後確保PHP數據庫驅動程序設置對齊以及充分利用數據庫連接。

以下是MariaDB線程池文檔的鏈接。我知道它說的是5.5版本,但它仍然相關,頁面沒有參考版本10.列出的設置可能不在您的.cnf文件中,您可以使用。

https://mariadb.com/kb/en/mariadb/threadpool-in-55/

+0

我很欣賞你的坦率,但我已經這樣做了很長一段時間,遵循最佳實踐,閱讀了許多關於這個主題的書籍,並且從未遇到過這個問題。我在這裏發佈,因爲無論查詢(通過僅使用mysqlslap來證明)將中等(<25%cpu負載)放在機器上,我都會從PHP-FPM獲取這些錯誤,而數據庫通過TCP快速響應或命令行。數據庫的優化對這種現象沒有影響。我不經常在這裏發佈問題,只是非常困難的東西。 – 2015-03-05 17:29:52

+0

我的意思不是粗魯,但我不是在尋找「閱讀手冊」作爲解決方案。我沒有用完CPU,RAM或文件描述符,數據庫沒有變慢,它反應非常好。在dmesg或mysql的日誌中沒有錯誤。這可能是操作系統或PHP的問題,我不確定哪一個,我在這裏得到一些幫助,因爲經過廣泛的研究後,我很難過 - 我已閱讀手冊。 – 2015-03-05 17:38:30

+0

這種方法是我用來解決這些問題。我只是想爲你查看RTFM以外的設置。你自便。 – 2015-03-05 18:23:11

0

從我的頭頂,我能想到的max_connections作爲問題的可能來源。我會增加限制,至少消除這種可能性。

希望它有幫助。

+0

感謝您的回答。我上面提到,我正在跟蹤 - 可用連接的最高使用率:26%(261/1000) – 2015-03-06 13:42:53