成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

關于MySQL內存泄露如何排查的一些思路

數據庫 MySQL
MySQL內存使用率過高,有諸多原因。普遍原因是使用不當,還有MySQL本身缺陷導致的。到底是哪方面的問題,那就需要一個一個進行排查。

[[414461]]

本文轉載自微信公眾號「數據和云」,作者崔虎龍 。轉載本文請聯系數據和云公眾號。

MySQL使用內存上升90%!在運維過程中50%的幾率,會碰到這樣的問題。算是比較普遍的現象。

MySQL內存使用率過高,有諸多原因。普遍原因是使用不當,還有MySQL本身缺陷導致的。到底是哪方面的問題,那就需要一個一個進行排查。

下面介紹排查思路:

1.參數配置需要確認,內存是否設置合理

MySQL內存分為全局和線程級:

  • 全局內存(如:innodb_buffer_pool_size,key_buffer_size,innodb_log_buffer_size)。
  • 線程級內存:(如:thread,read,sort,join,tmp 等)只是在需要的時候才分配,并且在操作完畢之后就釋放。
  • 線程級內存:線程緩存每個連接到MySQL服務器的線程都需要有自己的緩沖。默認分配thread_stack(256K,512k),空閑時這些內存是默認使用,除此之外還有網絡緩存、表緩存等。大致評估會在1M~3M這樣的情況。可通過pmap觀察內存變化:

  1. mysql> SELECT @@query_cache_size, 
  2.      @@key_buffer_size, 
  3.      @@innodb_buffer_pool_size , 
  4.      @@innodb_log_buffer_size , 
  5.      @@tmp_table_size , 
  6.      @@read_buffer_size, 
  7.      @@sort_buffer_size, 
  8.      @@join_buffer_size , 
  9.      @@read_rnd_buffer_size, 
  10.      @@binlog_cache_size, 
  11.      @@thread_stack, 
  12.      (SELECT COUNT(host) FROM  information_schema.processlist where command<>'Sleep')\G; 
  13. *************************** 1. row *************************** 
  14. @@query_cache_size:1048576 
  15. @@key_buffer_size:8388608 
  16. @@innodb_buffer_pool_size:268435456 
  17. @@innodb_log_buffer_size:8388608 
  18. @@tmp_table_size:16777216 
  19. @@read_buffer_size:131072 
  20. @@sort_buffer_size:1048576 
  21. @@join_buffer_size:1048576 
  22. @@read_rnd_buffer_size:2097152 
  23. @@binlog_cache_size:8388608 
  24. @@thread_stack:524288 
  25. (select count(host) from information_schema.processlist where command<>'Sleep'): 1 

備注:query_cache_size 8.0版本已經廢棄掉了。

2.存儲過程&函數&觸發器&視圖

目前積累的使用經驗中,存儲過程&函數&觸發器&視圖 在MySQL場景下是不適合的。性能不好,又容易發現內存不釋放的問題,所以建議盡量避免。

  • 存儲過程&函數

MySQL 5.7

  1. mysql> SELECT db,type,count(*)  
  2. FROM mysql.proc 
  3. WHERE db not in ('mysql','information_schema','performance_schema','sys'
  4. GROUP BY db, type; 

MySQL 8.0

  1. mysql> SELECT  Routine_schema, Routine_type 
  2. FROM information_schema.Routines 
  3. WHERE  Routine_schema not in ('mysql','information_schema','performance_schema','sys'
  4. GROUP BY Routine_schema, Routine_type; 
  • 視圖
  1. mysql> SELECT  TABLE_SCHEMA , COUNT(TABLE_NAME)  
  2. FROM information_schema.VIEWS 
  3. WHERE TABLE_SCHEMA not in ('mysql','information_schema','performance_schema','sys'
  4. GROUP BY TABLE_SCHEMA ; 
  • 觸發器
  1. mysql> SELECT TRIGGER_SCHEMA, count(*)  
  2.  FROM information_schema.triggers  
  3. WHERE  TRIGGER_SCHEMA not in ('mysql','information_schema','performance_schema','sys'
  4. GROUP BY TRIGGER_SCHEMA; 

上面通過MySQL配置參數和設計層面檢查了是否有可能內存泄露的問題。下面看看怎樣分析實際使用的內存情況。

3.系統庫統計查詢

  • 總內存使用
  1. mysql> SELECT  
  2. SUM(CAST(replace(current_alloc,'MiB','')  as DECIMAL(10, 2))  )  
  3. FROM sys.memory_global_by_current_bytes 
  4. WHERE current_alloc like '%MiB%'
  • 分事件統計內存
  1. mysql> SELECT event_name,     
  2. SUM(CAST(replace(current_alloc,'MiB','')  as DECIMAL(10, 2))  )     
  3. FROM sys.memory_global_by_current_bytes     
  4. WHERE current_alloc like '%MiB%' GROUP BY event_name   
  5.      ORDER BY SUM(CAST(replace(current_alloc,'MiB','')  as DECIMAL(10, 2))  ) DESC ; 
  6.  
  7. mysql> SELECT event_name, 
  8.        sys.format_bytes(CURRENT_NUMBER_OF_BYTES_USED) 
  9. FROM performance_schema.memory_summary_global_by_event_name 
  10. ORDER BY  CURRENT_NUMBER_OF_BYTES_USED DESC 
  11. LIMIT 10; 
  • 賬號級別統計
  1. mysql> SELECT user,event_name,current_number_of_bytes_used/1024/1024 as MB_CURRENTLY_USED 
  2. FROM performance_schema.memory_summary_by_account_by_event_name 
  3. WHERE host<>"localhost" 
  4. ORDER BY  current_number_of_bytes_used DESC LIMIT 10; 

備注:有必要統計用戶級別內存,因為很多環境對接了第三方插件,模擬從庫,這些插件容易內存不釋放。

  • 線程對應sql語句,內存使用統計
  1. SELECT thread_id, 
  2.        event_name, 
  3.        sys.format_bytes(CURRENT_NUMBER_OF_BYTES_USED)  
  4. FROM performance_schema.memory_summary_by_thread_by_event_name 
  5. ORDER BY  CURRENT_NUMBER_OF_BYTES_USED DESC 
  6. LIMIT 20; 
  1. SELECT m.thread_id tid, 
  2.        m.user
  3.        esc.DIGEST_TEXT, 
  4.        m.current_allocated, 
  5.        m.total_allocated 
  6. FROM sys.memory_by_thread_by_current_bytes m, 
  7.      performance_schema.events_statements_current esc 
  8. WHERE m.`thread_id` = esc.THREAD_ID \G 
  • 打開所有內存性能監控,會影響性能,需注意
  1. #打開 
  2. UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'memory/%'
  3. #關閉 
  4. UPDATE performance_schema.setup_instruments SET ENABLED = 'NO' WHERE NAME LIKE 'memory/%'
  5. #查看使用 
  6. SELECT * FROM performance_schema.memory_summary_global_by_event_name         
  7. WHERE EVENT_NAME LIKE 'memory/%'  
  8. ORDER BY CURRENT_NUMBER_OF_BYTES_USED DESC
  • 系統表內存監控信息
  1. select * from sys.x$memory_by_host_by_current_bytes; 
  2. select * from sys.x$memory_by_thread_by_current_bytes; 
  3. select * from sys.x$memory_by_user_by_current_bytes; 
  4. select * from sys.x$memory_global_by_current_bytes; 
  5. select * from sys.x$memory_global_total; 
  6. select * from performance_schema.memory_summary_by_account_by_event_name; 
  7. select * from performance_schema.memory_summary_by_host_by_event_name; 
  8. select * from performance_schema.memory_summary_by_thread_by_event_name; 
  9. select * from performance_schema.memory_summary_by_user_by_event_name; 
  10. select * from performance_schema.memory_summary_global_by_event_name; 

備注:找到對應問題事件或線程后,可以進行排查,解決內存高的問題。

4.系統工具查看內存

1)top命令

顯示系統中各個進程的資源占用狀況。

  • Shift + m 鍵 查看內存排名實際使用內存情況,關注RES指標。

2)free命令

free-h 命令顯示系統內存的使用情況,包括物理內存、交換內存(swap)和內核緩沖區內存。

  • used列顯示已經被使用的物理內存和交換空間。
  • buff/cache列顯示被buffer和cache使用的物理內存大小。
  • available列顯示還可以被應用程序使用的物理內存大小。
  • Swap行(第三行)是交換空間的使用情況。

3)ps命令

MySQL相關進程使用內存情況。

  1. shell > ps eo user,pid,vsz,rss $(pgrep -f 'mysqld'
  2. USER         PID    VSZ   RSS 
  3. root      215945  12960  2356 
  4. mysql     217246 1291540 241824 
  5. root      221056  12960  2428 
  6. mysql     374243 1336924 408752 

4)pmap 命令

pmap是Linux調試及運維一個很好的工具,查看進程的內存映像信息。

用法1:執行一段時間記錄數據變化,最少20個記錄,下面22837是MySQL pid

  1. while true; do pmap -d  22837  | tail -1; sleep 2; done 

用法2:linux 命令pmap MySQL pid導出內存,下面22837是MySQL pid

  1. pmap -X -p 22837 > /tmp/memmysql.txt 

RSS就是這個process實際占用的物理內存。

Dirty: 臟頁的字節數(包括共享和私有的)。

Mapping: 占用內存的文件、或[anon](分配的內存)、或[stack](堆棧)。

writeable/private:進程所占用的私有地址空間大小,也就是該進程實際使用的內存大小。

1.首先使用/top/free/ps在系統級確定是否有內存泄露。如有,可以從top輸出確定哪一個process。

2.pmap工具是能幫助確定process是否有memory leak。確定memory leak的原則:writeable/private (‘pmap –d’輸出)如果在做重復的操作過程中一直保持穩定增長,那么一定有內存泄露。

總結

對于MySQL內存泄露來說:

  • 從參數設置和設計上盡量合理
  • 通過ps庫進行排查
  • linux工具進一步確認
  • 官方bug里memory leak查找,是否存在修復的版本

以上排查里都沒有找到原因,可以換下服務器或主從切換觀察。也可以進行版本升級(代價不小)。

如能提供一個實際環境,也可以一步一步進行調試,抓取內存變化,確定是什么導致內存泄露的問題。之后提交bug,讓官方提供修復。

關于作者

 

崔虎龍,云和恩墨MySQL技術顧問,長期服務于金融、游戲、物流等行業的數據中心,設計數據存儲架構,并熟悉數據中心運營管理的流程及規范,自動化運維等。擅長MySQL、Redis、MongoDB數據庫高可用設計和運維故障處理、備份恢復、升級遷移、性能優化。自學通過了MySQL OCP 5.6和MySQL OCP 5.7認證。2年多開發經驗,10年數據庫運維工作經驗,其中專職做MySQL工作8年;曾經擔任過項目經理、數據庫經理、數據倉庫架構師、MySQL技術專家、DBA等職務;涉及行業:金融(銀行、理財)、物流、游戲、醫療、重工業等。

 

責任編輯:武曉燕 來源: 數據和云
相關推薦

2011-07-13 09:13:56

Android設計

2021-04-19 17:25:08

Kubernetes組件網絡

2013-04-07 10:40:55

前端框架前端

2009-06-18 09:51:25

Java繼承

2011-07-27 15:01:48

MySQL數據庫內存表

2018-11-15 08:19:47

大流量高并發限流

2015-08-24 09:26:18

Java內存問題見解

2023-01-04 18:32:31

線上服務代碼

2012-09-25 10:03:56

JavaJava封面Java開發

2011-07-29 09:33:21

iPhone 設計

2011-03-11 09:27:11

Java性能監控

2015-12-04 10:04:53

2012-04-19 10:06:55

微軟Windows 8 E

2020-09-28 06:45:42

故障復盤修復

2017-12-21 07:54:07

2009-06-04 16:28:43

EJB常見問題

2022-04-14 10:22:44

故事卡業務

2018-07-30 08:41:48

VueReact區別

2020-04-10 08:50:37

Shell腳本循環

2020-05-19 14:35:42

Shell腳本循環
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人久久精品一区二区三区 | 在线观看免费av网 | 懂色中文一区二区在线播放 | 婷婷一级片 | 欧美理论片在线 | 成人一区二区在线 | 成年人免费在线视频 | 成人不卡 | 久久精品这里精品 | 国产亚洲欧美另类一区二区三区 | 日韩av一区二区在线观看 | 久久中文字幕一区 | 国产网站在线免费观看 | 91精品国模一区二区三区 | 欧美一级精品片在线看 | 亚洲+变态+欧美+另类+精品 | 成人毛片网 | 五月天天色| 日韩精品视频在线观看一区二区三区 | 欧美一级久久 | 久久新视频| h视频在线播放 | 国产精品免费一区二区三区四区 | 国产一区二区三区四区五区3d | 偷拍自拍网| 伊人青青久久 | 97国产超碰| 亚洲国产成人精品久久 | 国产精品成人一区二区三区 | 国产视频1 | 国产中的精品av涩差av | 婷婷在线免费 | 免费看国产片在线观看 | 狠狠干天天干 | 天天插天天操 | 国产人成精品一区二区三 | 国产99精品 | av在线播放一区二区 | 中文字幕久久久 | 91 在线| 亚洲精品欧美 |