MySQL生產庫記憶體異常增高怎麼排查

WBOY
發布: 2023-05-29 23:25:19
轉載
1772 人瀏覽過

修改performance_schema

因為公司生產環境使用的阿里雲RDS,修改參數相對方便,performance_schema預設為0,這次修改為1。修改之後提交參數,資料庫會重啟,建議在業務低高峰進行。

開啟記憶體監控

登入MySQL資料庫,執行下列SQL,開啟記憶體監控。

update performance_schema.setup_instruments set enabled = 'yes' where name like 'memory%';
登入後複製

開啟之後驗證一下。

select * from performance_schema.setup_instruments where name like 'memory%innodb%' limit 5;
登入後複製

**注意:**該命令是在線打開內存統計,所以只會統計打開後新增的內存對象,打開前的內存對像不會統計,建議您打開後等待一段時間再執行後續步驟,方便找出記憶體使用高的執行緒。

找出記憶體消耗

統計事件消耗記憶體

select event_name,
       SUM_NUMBER_OF_BYTES_ALLOC
from performance_schema.memory_summary_global_by_event_name
order by SUM_NUMBER_OF_BYTES_ALLOC desc
LIMIT 10;
+---------------------------------------+-------------------------------------+
| event_name                            | SUM_NUMBER_OF_BYTES_ALLOC           |
+---------------------------------------+-------------------------------------+
| memory/sql/Filesort_buffer::sort_keys | 763523904056                        |
| memory/memory/HP_PTRS                 | 118017336096                        |
| memory/sql/thd::main_mem_root         | 114026214600                        |
| memory/mysys/IO_CACHE                 | 59723548888                         |
| memory/sql/QUICK_RANGE_SELECT::alloc  | 14381459680                         |
| memory/sql/test_quick_select          | 12859304736                         |
| memory/innodb/mem0mem                 | 7607681148                          |
| memory/sql/String::value              | 1405409537                          |
| memory/sql/TABLE                      | 1117918354                          |
| memory/innodb/btr0sea                 | 984013872                           |
+---------------------------------------+-------------------------------------+
登入後複製

可以看到記憶體消耗最高的event是Filesort_buffer,根據經驗,這個應該是排序有關。

統計執行緒消耗記憶體

select thread_id,
       event_name,
       SUM_NUMBER_OF_BYTES_ALLOC
from performance_schema.memory_summary_by_thread_by_event_name
order by SUM_NUMBER_OF_BYTES_ALLOC desc
limit 10;
+---------------------+---------------------------------------+-------------------------------------+
| thread_id           | event_name                            | SUM_NUMBER_OF_BYTES_ALLOC           |
+---------------------+---------------------------------------+-------------------------------------+
| 105                 | memory/memory/HP_PTRS                 | 69680198792                         |
| 183                 | memory/sql/Filesort_buffer::sort_keys | 49210098808                         |
| 154                 | memory/sql/Filesort_buffer::sort_keys | 43304339072                         |
| 217                 | memory/sql/Filesort_buffer::sort_keys | 37752275360                         |
| 2773                | memory/sql/Filesort_buffer::sort_keys | 31460644712                         |
| 218                 | memory/sql/Filesort_buffer::sort_keys | 31128994280                         |
| 2331                | memory/sql/Filesort_buffer::sort_keys | 28763981248                         |
| 106                 | memory/memory/HP_PTRS                 | 27938197584                         |
| 191                 | memory/sql/Filesort_buffer::sort_keys | 27701610224                         |
| 179                 | memory/sql/Filesort_buffer::sort_keys | 25624723968                         |
+---------------------+---------------------------------------+-------------------------------------+
登入後複製

可以看到記憶體消耗多的執行緒都跟Filesort_buffer相關。

定位具體SQL

根據前邊我們查到的thread_id去日誌裡尋找對應的SQL,阿里雲RDS稽核日誌相對還是比較強大的。我們直接根據thread_id直接檢索。

MySQL生產庫記憶體異常增高怎麼排查

我們在日誌裡看到大量這樣的SQL,掃描行數在幾千到幾萬不等。儘管每次查詢的時間不長,通常在幾十到幾百毫秒之間,但並發請求的數量很大。

#

以上是MySQL生產庫記憶體異常增高怎麼排查的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板