1. 程式人生 > >Docker:MySQL連線慢問題解決

Docker:MySQL連線慢問題解決

問題描述:

由於MySQL是使用Docker容器搭建起來的,在今天的資料庫連線中,發現比平時的連線速度變慢了很多,每次連線大概延遲了10秒左右。

排查過程

1、 伺服器資源
檢視系統的CPU、網路等負載,無異常。

2、資料庫連線池
一開始懷疑是連線數過多導致,登入MySQL後發現連線數有近200,於是kill掉一部分,發現還是連線緩慢。
排除連線數導致緩慢。

3.、網路問題
在ping伺服器的時候並沒有出現數據包延遲、丟包現象。
網路問題排除。

4、MySQL DNS解析
查閱了相關資料,覺得可能是MySQL的DNS解析配置。於是我從內網連線MySQL,居然也是一樣慢,一下又沒了頭緒。

突然想起自己是使用的Docker搭建的MySQL,於是我連入容器內部連線MySQL,秒連!定位到問題所在了,就是MySQL的DNS解析配置問題。

查找了一些相關資料,這是MySQL文件關於DNS的部分說明:

How MySQL uses DNS
When a new thread connects to mysqld, mysqld will spawn a new thread to handle the request. This thread will first check if the hostname is in the hostname cache. If not the thread will call gethostbyaddr_r() and gethostbyname_r() to resolve the hostname.
If the operating system doesn’t support the above thread-safe calls, the thread will lock a mutex and call gethostbyaddr() and gethostbyname() instead. Note that in this case no other thread can resolve other hostnames that is not in the hostname cache until the first thread is ready.
You can disable DNS host lookup by starting mysqld with –skip-name-resolve. In this case you can however only use IP names in the MySQL privilege tables.
If you have a very slow DNS and many hosts, you can get more performance by either disabling DNS lookop with –skip-name-resolve or by increasing the HOST_CACHE_SIZE define (default: 128) and recompile mysqld.

大概意思就是說如果你有一個非常慢的DNS和許多主機,您可以通過使用-skip-name-resolve禁用DNS

解決過程

修改MySQL配置檔案,新增skip-name-resolve

[mysqld]
skip-name-resolve

重啟MySQL容器:

[[email protected] /root]#docker restart mysqlN
mysqlN

重啟完連線測試,秒連!

問題解決。