2017-02-16 43 views
3

爲什麼連接到我的InnoDB數據庫通常會延遲整數秒的時間?連接到MySQL數據庫很慢,需要n秒

一些背景

我有一個非常小的MySQL數據庫,由表 '用戶'(150條記錄)和表 '連接'(增長到150 * 150條記錄)。表和索引加起來小於5 MB。

當用戶處於活動狀態時,「連接」中的5-50條記錄發生更改(重量發生變化)或添加(如果它們尚不存在)。整個應用程序運行平穩,加載時間低於〜100毫秒。

除外。

細節

下甚至相當小的負載,頁面加載時間秒殺從60毫秒到毫秒和10000毫秒之間的某處1000。

使用Symfony中的分析器,我可以在'getRepository'語句中鎖定95 +%的延遲,而查詢每個查詢只需要約1毫秒。這使我相信連接數據庫是一個緩慢的行動。我寫了一個定期連接到數據庫的幫手腳本來測試這個理論。

<?php // call this script commandline using watch 
$a = microtime(true); 
$pdo = new PDO('mysql:host=127.0.0.1;dbname=mydb','myuser','mypass'); 
file_put_contents('performance.txt', (microtime(true)-$a).PHP_EOL, FILE_APPEND); 

神祕

連接到數據庫了一貫1-3毫秒,或1,001-1,003毫秒,或2,001-2,003毫秒,或3,001-3,003毫秒等的一個整數量秒,加上正常的時間。之間沒有什麼,如400毫秒或800毫秒。在沒有寫入的情況下,連接幾乎立即進行。一旦通過應用程序進行了一些寫操作,就會達到更高的數字。

是什麼導致了這種行爲? InnoDB page_cleaner似乎每隔1000毫秒就會完成一次工作,也許這是解釋的一部分?

更重要的是,我該如何解決這個問題?我正在考慮切換到MEMORY表,但我會說更優雅的選項應該可用。

編輯

根據要求,the variables and global status

附加信息:我直接連接到127.0.0.1(請參閱上面的代碼片段),我測試了skip-name-resolve標誌,結果無效。順便說一下,這是一個Debian服務器。

編輯2

我發現的延遲要麼1,3,7或15秒。注意模式:1秒,+ 2s,+ 4s,+ 8s。這真的看起來有些超時問題...

+1

讀取更改爲內存表,如果問題是連接,如果我理解你正確地發出可能不會幫助。我會懷疑的事情:沒有足夠的線程/(db)連接可用,連接池設置(僅僅因爲我們曾經遇到過一個問題:))或類似的東西。連接速度很慢,而不是查詢。也許看看'innotop'屏幕,而緩慢進行?如果你沒有看到任何長時間運行的查詢和更高的負載,則創建連接時出現問題 – Nanne

+0

不知道'innotop',感謝提示。負載:0.00,QPS:10-20,慢速:0,QCacheHit:50%,KCacheHit:100.00%。看起來問題確實不是問題。 – TacoV

+0

我切換到MEMORY作爲測試。奇怪的連接延遲問題依然存在...... – TacoV

回答

1

反向dns查找需要很長時間是很常見的。隨着host_cache的大小,它可能會產生不穩定的行爲。

把它加入我的。cnf

[mysqld] 
skip-name-resolve 

請注意,如果您更改此設置,所有授權都必須通過ip,而不是通過名稱。

還有更多的manual

+0

我已經將此添加到my.cnf中,如config dump(「skip_name_resolve ON」)中所示。問題依然存在。 – TacoV