自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MySQL的內(nèi)存和相關(guān)問題排查

存儲(chǔ) 存儲(chǔ)軟件 MySQL
我們都知道數(shù)據(jù)庫是IO密集型一類應(yīng)用,為了提高其性能大量使用內(nèi)存代替文件(交換分區(qū))的IO操作是保證數(shù)據(jù)庫穩(wěn)定、高效的基本原則。那么數(shù)據(jù)庫是如何使用內(nèi)存的,我們?nèi)绾尾榭磾?shù)據(jù)庫內(nèi)存的占用,如何通過通過數(shù)據(jù)庫內(nèi)存配置設(shè)置提高其性能?

 我們都知道數(shù)據(jù)庫是IO密集型一類應(yīng)用,為了提高其性能大量使用內(nèi)存代替文件(交換分區(qū))的IO操作是保證數(shù)據(jù)庫穩(wěn)定、高效的基本原則。那么數(shù)據(jù)庫是如何使用內(nèi)存的,我們?nèi)绾尾榭磾?shù)據(jù)庫內(nèi)存的占用,如何通過通過數(shù)據(jù)庫內(nèi)存配置設(shè)置提高其性能?本文蟲蟲就以Mysql數(shù)據(jù)庫(InnoDB引擎)為例和大家一起了解下Linux數(shù)據(jù)庫和內(nèi)存相關(guān)的主題。

讀取內(nèi)存數(shù)據(jù)非??欤瑸榱颂岣咝阅芪覀円M***可能把數(shù)據(jù)集都放到內(nèi)存中以保證高效。但是Swap交換分區(qū)作為一個(gè)救命的稻草,我們還必須要給mysql設(shè)置,防止突發(fā)情況下內(nèi)存不夠,mysql服務(wù)直接被OOM殺掉的情況。同時(shí)mysql交換分區(qū)占用也是我們衡量一個(gè)數(shù)據(jù)是否健康與否的手段,如果一個(gè)數(shù)據(jù)庫頻繁的使用了swap則說明,我們需要人工干預(yù)優(yōu)化數(shù)據(jù)庫了。

內(nèi)存占用

在Linux下,我們可以通過使用一些shell命令來了解MySQL的內(nèi)存使用情況。

首先使用ps命令來查看mysqld進(jìn)程的內(nèi)存使用情況:

  1. ps -eo size,pid,user,command --sort -size|grep mysqld 
  2. |awk '{hr=$1/1024;printf("%13.2f MB",hr)} {for (x=4;x<=NF;x++){printf("%s",$x)}print ""}' 
  3. |cut -d "" -f2|cut -d "-" -f1 

MySQL的內(nèi)存和相關(guān)問題排查

  1. 1990.88 MB/usr/local/mariadb/bin/mysqld 
  2. 0.49 MB/bin/sh/usr/local/mariadb/bin/mysqld_safe 

top命令也可以查看對應(yīng)上面的結(jié)果也可以用top來得到:

  1. top -b -o %MEM -n1 -p $(pidof mysqld) | grep PID -A 

MySQL的內(nèi)存和相關(guān)問題排查

  1. PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
  2. 2239 mysql 20 0 2108536 316836 7548 S 0.0 4.0 48:47.37 mysqld 

其中,VIRT(virtual memory usage)表示mysql使用的虛擬內(nèi)存總量。它包括所有代碼,數(shù)據(jù)和共享庫以及最終要被置換出的頁面。

RES(resident memory usage) 常駐內(nèi)存,包括當(dāng)前進(jìn)程使用的內(nèi)存,不包括置換出的內(nèi)存。

SHR(shared memory) 共享內(nèi)存,進(jìn)程使用的的共享內(nèi)存,也包括其他進(jìn)程的共享內(nèi)存。

交換分區(qū)

我們再來檢查檢查mysqld是否正在使用交換分區(qū),首先用free -m檢查是否有用到交換分區(qū)。

  1. free -m 

MySQL的內(nèi)存和相關(guān)問題排查

  1. total used free shared buff/cache available 
  2. Mem: 7822 5091 178 83 2552 2290 
  3. Swap: 3999 2 3997 

上面結(jié)果了,系統(tǒng)使用少量的交換分區(qū)(2M),那怎么判斷是不是MySQL用的呢?我們來驗(yàn)證:

  1. cat /proc/$(pidof gitlab)/status | grep Swap 

MySQL的內(nèi)存和相關(guān)問題排查

 

VmSwap:0 kB

可見mysqld不沒用用到交換區(qū),說明我的mysqld在高效運(yùn)行中。

這兒我們提供一個(gè)腳本,遍歷每一個(gè)進(jìn)程,找出那些進(jìn)程使用了交換分區(qū):

  1. for i in $(ls -d /proc/[0-9]*) 
  2. do 
  3. out=$(grep Swap $i/status 2>/dev/null
  4. if [ "x$(echo $out | awk '{print $2}')" != "x0" ] && [ "x$(echo $out | awk '{print $2}')" != "x" ] 
  5. then 
  6. echo "$(ps -p $(echo $i | cut -d'/' -f3) 
  7. | tail -n 1 | awk '{print $4'}): $(echo $out | awk '{print $2 $3}')" 
  8. fi 
  9. done 

MySQL的內(nèi)存和相關(guān)問題排查

 

當(dāng)然,交換中的頁面可能已經(jīng)存在很長時(shí)間了,自從使用一次后,后面就沒有在用過。為了獲取實(shí)時(shí)交換分區(qū)情況,我們可以用vmstat

  1. vmstat 1 10 

MySQL的內(nèi)存和相關(guān)問題排查

 

在這個(gè)服務(wù)器上,我們可以看到mysqld沒有使用交換,如果系統(tǒng)內(nèi)存充足,但是mysqld還占用了部分交換分區(qū),是怎么回事?怎么排查呢?

如果遇到這種情況,可能的直接原因有swappiness和Numa。

Swappiness

swappiness參數(shù)控制內(nèi)核將進(jìn)程移出物理內(nèi)存并將其放入交換磁盤分區(qū)的趨勢。我們之前也說過了磁盤IO操作要比RAM慢很多很多,因此如果進(jìn)程過于頻繁地從內(nèi)存中置換出,這會(huì)導(dǎo)致系統(tǒng)和應(yīng)用程序的響應(yīng)時(shí)間變慢。高swappiness值意味著內(nèi)核更容易取消內(nèi)存頁面。低swappiness相反,內(nèi)核將不太容易取消內(nèi)存頁面。swappiness值越高,系統(tǒng)內(nèi)存置換的越多。

linux下系統(tǒng)(CentOS、Red Hat、ubuntu)默認(rèn)的swappiness值為60。如果內(nèi)存較小則應(yīng)適當(dāng)調(diào)高這個(gè)值。對于內(nèi)存足夠的MySQL服務(wù)器,這個(gè)默認(rèn)設(shè)置就有點(diǎn)太高了,應(yīng)該減少。一般情況下,業(yè)界建議這個(gè)值可以設(shè)置到5.或者更小。設(shè)置swappiness方法是使用sysctl命令直接改變內(nèi)核參數(shù)。

  1. sysctl -w vn.swappinness = 1 

NUMA設(shè)置

還有一個(gè)方面就是NUMA設(shè)置。對于具有多個(gè)NUMA核心的服務(wù)器,建議將NUMA模式設(shè)置為交錯(cuò),以平衡所有節(jié)點(diǎn)的內(nèi)存分配。 在***的MySQL 8.0中支持為InnoDB設(shè)置NUMA??梢栽谂渲猛ㄟ^啟動(dòng):innodb_numa_interleave = 1

要檢查是否有多個(gè)NUMA節(jié)點(diǎn),可以使用numactl -H

這是兩種不同的輸出:

MySQL的內(nèi)存和相關(guān)問題排查

 

MySQL的內(nèi)存和相關(guān)問題排查

 

我們可以看到,當(dāng)有多個(gè)NUMA節(jié)點(diǎn)(下)時(shí),默認(rèn)情況下,內(nèi)存不會(huì)在所有節(jié)點(diǎn)之間平均分配。這可以導(dǎo)致更多內(nèi)存置換。

文件系統(tǒng)緩存

默認(rèn)情況下,Linux將使用文件系統(tǒng)會(huì)對所有的I/O操作進(jìn)行緩存(這是不建議使用MyISAM的原因之一,MyISAM存儲(chǔ)引擎依賴于FS緩存,并且可能導(dǎo)致丟失數(shù)據(jù))。Mysql InnoDB引擎中使用O_DIRECT作為innodb_flush_method,MySQL將繞過文件系統(tǒng)緩存,不會(huì)將任何FS Cache Memory用于數(shù)據(jù)文件(* .ibd)。

當(dāng)然在MySQL中使用的其他非數(shù)據(jù)文件仍會(huì)使用FS Cache。我們來看個(gè)例子:

  1. dbsake fincore binlog.000017 
  2. binlog.000017: total_pages=120841 cached=50556 percent=41.84 
  3. ls -lh binlog.000017 
  4. -rw-r----- 1 mysql mysql 473M Sep 18 07:17 binlog.000017 
  5. free -m 
  6. total used free shared buffers cached 
  7. Mem: 5965 4608 1356 128 435 2456 
  8. -/+ buffers/cache: 1716 4249 
  9. Swap: 2045 30 2015 
  10. dbsake uncache binlog.000017 
  11. Uncached binlog.000017 
  12. free -m 
  13. total used free shared buffers cached 
  14. Mem: 5965 4413 1552 128 435 2259 
  15. -/+ buffers/cache: 1718 4247 
  16. Swap: 2045 30 2015 

開始檢查文件系統(tǒng)緩存中存在多少二進(jìn)制日志(使用dbsake fincore),我們可以看到473M中有42%使用RAM作為FS緩存。然后我強(qiáng)制取消在緩存中使用這些頁面(使用fincore uncache),結(jié)果,我們釋放了+/- 195MB的RAM。

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2021-06-28 08:00:00

Python開發(fā)編程語言

2021-02-26 13:35:46

JavaCPU內(nèi)存

2024-08-19 00:10:00

C++內(nèi)存

2015-07-20 10:23:24

NET內(nèi)存問題排查

2022-07-03 20:31:59

JVMJava虛擬機(jī)

2022-01-26 19:42:05

MySQL亂碼排查

2021-11-14 05:00:56

排查Sdk方式

2022-02-08 17:17:27

內(nèi)存泄漏排查

2024-01-05 09:23:09

Linux系統(tǒng)內(nèi)存內(nèi)存指標(biāo)

2019-12-17 10:01:40

開發(fā)技能代碼

2018-08-10 15:00:42

服務(wù)器內(nèi)存排查

2010-05-11 13:42:36

MySQL隱藏空間

2014-02-27 13:30:26

CacheLinux系統(tǒng)內(nèi)存不足

2011-03-31 14:05:01

mysql

2019-04-29 14:23:46

Java服務(wù)器CPU

2022-04-11 15:10:34

微服務(wù)遷移goroutine

2021-07-30 20:59:21

MySQL內(nèi)存.參數(shù)

2015-09-21 09:10:36

排查修復(fù)Windows 10

2019-01-29 08:41:16

MySQL性能突發(fā)事件

2022-05-08 09:11:44

WiFi樹莓派GO
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號