一台unibilling機器前幾天突然負載變重. 在top中發現cpu被大量占用. agi程序運行的很慢,並出現僵屍進程. 其實當時只有50個左右的並發呼叫. 遠遠達不到正常水准. 重新啟動機器問題也沒得到解決. 非常奇怪.
考慮到在top中看到mysqld占用的資源最多,就進入mysql控制台,運行 show processlist命令, 發現某進程的信息很特殊:
代碼如下 復制代碼 User "unauthenticated user"State "reading from net"難道是黑客從internet上攻擊我的機器? 顯然不是, 因為Host那一列顯示的是”localhost”.
沒辦法. 在google上一查找,竟發現若干人遇到過該問題. 也不能算是mysql的bug,因為通過更改配置文件 /etc/my.cnf即可解決.
具體地講,在mysqld那一欄中添加 skip-name-resolve
[mysqld]
代碼如下 復制代碼skip-name-resolve
注意, skip-name-resolve可以禁用dns解析,但是,這樣不能在mysql的授權表中使用主機名了,只能使用IP. 以前創建mysql用戶是若用的是localhost現在則需要用127.0.0.1來代替在grant語句中執行一下添加該用戶.
然後, 重新啟動mysqld.
網上找到的另一些說法
發現這屬於官方一個系統上的特殊設定,亦可稱呼他為MySQL的bug,不管連結的的方式是經過hosts或是IP的模式,他都會對DNS做反查。MySQL會嘗試去反查IP->DNS,由於反查解析過慢,無法應付快速多量的查詢。
解決方式很簡單:啟動MySQL的時候,添加--skip-name-resolve選項,禁止域名解析,問題解決
代碼如下 復制代碼
mysql >show full processlist;
發現大量 unauthenticated user 連接信息
13012 unauthenticated user x.x.x.x:2501 None Connect Reading from net
10056 unauthenticated user x.x.x.x:2805 None Connect Reading from net
10311 unauthenticated user x.x.x.x:2306 None Connect writing to net
10326 unauthenticated user x.x.x.x:2715 None Connect login
10422 unauthenticated user x.x.x.x:2811 None Connect login
查閱網上資料,主要介紹解決方法如下:
1. 在 /etc/my.cnf 通過添加 skip-name-resolve 參數,關閉mysql的dns反查詢,mysql使用IP授權
2. 在 /etc/hosts 添加IP與主機名對應關系 ,檢查 /etc/resovle主DNS服務.
3. 調整mysql max_connections,max_allowed_packet ,wait_timeout,interactive_timeout 參數
經確認其實上面配置大部分參數生產環境都是已經配置過,出現大量unauthenticated user 信息時表明mysql沒有給這些客戶端連接請求確認憑證,也就是說mysql無法確認這些連接使用的數據庫賬號信息,在wait_timeout之內mysql一直等待這些連接完成, 通過測試 telnet x.x.x.x 3306 觀察,在mysql數據庫也會出現一條 unauthenticated user x.x.x.x:4706 None Connect Reading from net 連接, 因此這種現象不一定就是數據庫問題 ,下面這些都有可能產生這種現象
1.如果應用安全問題出現大量數據庫探測,出現大量這種未經授權的連接
2.應用服務壓力過大出現線程異常中斷導致出現大量異常數據庫連接
3.應用服務異常,導致出現大量異常數據庫連接
4. MySQL 客戶端連接版本問題,驗證協議不兼容,尤其注意old-password驗證方式
最後通過投票系統加入驗證碼防止刷票,減少出現非法和異常連接可能性,重啟PHP服務後CPU負載恢復正常,mysql數據庫unauthenticated user連接也沒再出現。