2015-04-12 63 views
2

我正在運行MySql 5.6,並且我注意到,當我對服務器進行基準測試(在一段時間內並行執行幾百個查詢)時,m1.large aws實例的CPU利用率從未超過50% 。未充分利用MySQL服務器; threads_running小於2

我已在thread_cache變量設置爲50和max_connections 500當我執行從殼下面的命令,

  1. 中mysqladmin -u根-ppassword -r -i 1個分機| grep的由Threads_created

    我注意到,創建的線程不穿過3

  2. 中mysqladmin -u根-ppassword -r -i 1個分機| grep Threads_running

    我注意到,運行的線程永遠不會穿越3,有時會變成-1。

  3. SHOW STATUS; (從MySQL控制檯運行此)

    我注意到Threads_Cached是0,儘管thread_cache_size的是50

我運行前端服務器的連接請求轉發到MySQL。我正在使用大小爲50的連接池。不應該把threads_created更改爲50嗎?我理解這個權利嗎?

更新:

我更新了我的前端服務器從承運人到Jetty。我現在使用c3p0來完成連接池。我配置了50個連接,現在我可以注意到threads_running和threads_running上升到50.

但是,我的CPU利用率仍然沒有超過60%爲我的MySQL進程。

機的詳細信息:AWS m1.large例如,2個內核(4個vCPU),7.5GB RAM 的MySQL版本:5.6 引擎:MyISAM數據 行:85個百萬 查詢類型:只讀 查詢:選擇一個, b,c從表格WHERE文本=? AND date> =?和日期< =?; 我對文本,日期字段有一個複合索引,當我在這個查詢上運行EXPLAIN時,我能夠看到正在使用索引。

感謝, V

+0

這是我第一次發帖,我很想知道我的錯在哪裏,以便我糾正自己,而不是僅僅得到否定的投票。 – Venkey

+0

如果您是基準測試,那麼您是如何運行並行mysql線程或查詢的?你是否禁用了query_cache? 最大的線程是上限,不需要總是運行 – georgecj11

+0

您好cjg, 我正在使用JMeter ...現在我有一個自定義程序,產生'n'指定的線程。每個線程運行'k'指定查詢次數.. 我還沒有禁用查詢緩存!我可以做? – Venkey

回答

1

多少核心? 積極當你看到50%時做的事情有多少個連接?我猜你有2個內核,並且你有一個活動連接。由於MySQL每個連接不使用多個核心,這就是50%。

您提到的「線程」值是可以的。詳細...

「Thread_cache」是一個令人困惑的概念。以下是發生了什麼事情:當新客戶端嘗試連接時,mysqld(服務器)在其「線程緩存」中查看是否有任何存在。否則,它將爲該連接創建一個新的操作系統「進程」。這是一個適度耗時的任務,因此需要緩存。

當連接斷開連接(並且沒有「連接池」)時,進程將被放入線程緩存。但線程緩存的上限爲thread_cache_size。對於Windows,此VARIABLE的值應爲0,對於unix,此值通常爲10。但價值並不重要。

max_connections控制可以同時連接多少個客戶端。通常他們忙於做其他事情,所以SHOW PROCESSLIST說「睡眠」。 wait_timeout將強制斷開睡眠時間超過該設置的人員(如果他們還沒有自動斷開連接)。

STATUSThreads_created表示自MySQL啓動以來發生了多少新連接。 Threads_running表示當前有多少人連接,但不是「睡眠」。 (-1似乎是錯誤的。)Threads_cached = 0可能意味着,例如,3個客戶端已連接並且它們仍然連接,再加上您從未連接超過3個客戶端。

由於您擁有「連接池」,因此連接永遠不會死亡。

您還沒有打50,因爲你沒有足夠的客戶需要50

連接池和Thread_cache所服務的同一緩存的目的,但以不同的方式。兩者都可以,但是兩者都沒有多大的收益。

+0

感謝里克的明確解釋! 我有一個2核心機器(4虛擬化的vCPUS,AWS,Xen)。我將前端服務器從Undertow更改爲Jetty,並將c3p0用於連接池。我現在能夠看到更多threads_running。此外,當連接的客戶端斷開.. threads_cached上升! 但是,對於mysql進程,CPU利用率仍然不會超過60%。 – Venkey