Mysql:是否可以在 CPU 較低的情況下處理 1000 個並發?
我們正在執行 Centos 7,我們正在處理 Mariadb 5.5,今天升級到 10.3。PHP 5。
查詢很糟糕,要優化的查詢太多了,但我正在盡我所能,數據庫結構很糟糕。
客戶不關心查詢優化,他只是想降低 CPU 使用率,他執行負載測試工具locust,給它 1500 個使用者和 1000 個並發,看到 CPU 在 90s % 並說這很糟糕。搜尋功能是他說的問題。
我再一次告訴你,查詢很糟糕,我剛剛被錄用並儘我所能,但他是否在尋找正確的指標?
除了修復查詢之外,我還嘗試過做什麼:
添加索引,也沒有索引
my.cnf
innodb_stats_on_metadata = 0 innodb_buffer_pool_dump_at_shutdown =1 innodb_buffer_pool_load_at_startup =1 ## innodb_buffer_pool_instances should match the number of cores on the server innodb_log_file_size = 2047M innodb_flush_method=O_DIRECT sync_binlog=0 innodb_thread_concurrency = 48 innodb_read_io_threads = 24 innodb_write_io_threads = 24 ## set innodb_buffer_pool to 50% to 70% of the ram on the server so if the server have 32G, then set it to 16G. 50% is a good start ## turn off slow query log, if you're not logging, and only log for small durations when you want to monitor things slow_query_log =0
我也嘗試從慢查詢日誌中優化我所能做的。還嘗試使用 proxySQL,我聽說它會攔截查詢並將 1/10 的查詢發送到伺服器,因為記憶體。
客戶有一個流媒體應用程序,在高峰事件期間,他達到了 7k 使用者,不確定這是否算作並髮使用者,並且高度懷疑所有使用者都會搜尋。他們有一個本地伺服器
DL380 Gen10 2x Intel Xeon Silver 4110 / 2.1 GHz 64 GB RAM 300 GB HDD
我的問題:
- 有什麼我不知道的措施可以減少搜尋查詢的 CPU 使用率嗎?
- 如果我要優化所有查詢,在這樣的負載測試下我會期望更低的 CPU 嗎?他們希望 CPU 使用率下降到 50%,我只是覺得他們正在查看錯誤的指標。他們有權這樣做,因為過去每當 cpu 達到 100% 時,伺服器就會停機。
以下是如何確定要修復的“壞”查詢,這將為您帶來最大的收益:slowlog plus
pt-query-digest
。更多細節在這裡:http: //mysql.rjweb.org/doc.php/mysql_analysis#slow_queries_and_slowlog我很少需要列出超過 3 個項目來做出顯著的改進。
如果您不知道要添加哪些索引,請不要簡單地“索引曾經的列”。見http://mysql.rjweb.org/doc.php/index_cookbook_mysql
有什麼我不知道的措施可以減少搜尋查詢的 CPU 使用率嗎?
不會。通過使用選定的複合索引和/或重新編寫查詢來解決高 CPU 問題。向我們展示查詢。“搜尋”這個詞太模糊了。
這是一個極端的軼事:CPU 被固定在 100%。慢日誌指向一個查詢。它有
WHERE DATE(foo) = '...'
。通過使那個“sargable”,CPU 下降到 2%。至於基準…當心。他們傾向於在馬力耗盡之前查看可以執行多少個連接。也就是說,結果保證說100% CPU!他們得到的真正指標是“查詢/秒”或“最大連接數”。
此外,一再證明,如果您將 mysql 推送到超過一定數量的並髮使用者,吞吐量會下降!十年前,這個數字大約是 6;現在它更像是 64。但是 1000?沒門。它正在旋轉它的輪子,因為所有 1000 人都在相互絆倒。
如何處理 1000 個使用者?複製餵養多個從站。這樣,您可以擁有 1000 個從站,每個從站僅執行 10 個連接;CPU會很低。等等。