Linux記憶體異常問題處理
今天在做幾臺資料庫初始化部署的時候,發現啟動資料庫由於記憶體不足導致啟動失敗。檢視系統記憶體總共是32G,已經使用了21G,其中cached也就2G,最奇怪的是系統中也沒有其他程式佔用大量記憶體。經過層層分析,終於解開了系統記憶體異常佔用的原因,具體分析處理過程如下:
1、檢視系統記憶體的使用情況
從中可以看到系統記憶體總大小是31G,已使用21G,空閒9G,cache的2G,swap暫未使用
2、檢視系統程式記憶體佔用情況
透過top簡單M按照記憶體使用情況排序看,系統記憶體使用最大的也就245M,總體使用不會超過19G
3、透過指令碼進一步檢視系統記憶體使用情況
檢視所有PID使用的記憶體最大值以及當前值
4、透過上述的兩個記憶體檢視,基本可以排除是由於程式佔用了大量的系統記憶體,那麼我們還有什麼思路會導致系統記憶體被大量佔用呢?
由於這些伺服器是虛擬機器,我懷疑是不是由於實體記憶體的共享導致的記憶體佔用呢? (由於宿主機不在我這,所以這個不好排查)
或者會不會是某個記憶體佔用,未釋放導致的系統記憶體被佔用?(經過重啟伺服器,發現系統記憶體在啟動即被佔用19G)
亦或者是某個系統引數設定導致系統記憶體被啟動就分配佔用?(聯想到hugepage可能會導致此類問題)
5、檢查hugepage是否開啟
# cat /sys/kernel/mm/redhat_transparent_hugepage/enabled (其他非rhel linux 可使用cat /sys/kernel/mm/transparent_hugepage/enabled)
[always] madvise never
發現系統開啟了透明大頁,透過下面命令進一步確認
# cat /proc/meminfo | grep -i huge
AnonHugePages: 0 kB
HugePages_Total: 9732
HugePages_Free: 9732
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
6、關閉Hugepage,釋放記憶體
vi /etc/sysctl.conf
#vm.nr_hugepages = 9732 將大頁數量的配置註釋掉或者刪除,然後透過sysctl -p使其生效
vi /etc/security/limits.conf
#oracle soft memlock unlimited ##使用者記憶體鎖限制註釋掉
#oracle hard memlock unlimited
重啟OS,檢查系統記憶體是否正常,大頁是否關閉
free -g
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
cat /proc/meminfo | grep -i huge
7、Hugepage附錄
(1)開啟hugepage優缺點
優點:提高TLB的命中率、利用HugePages不會被Swap 的特性保證記憶體不會被交換到Swap中
缺點:佔用較大的系統記憶體,即時不起任何應用的情況下,也會佔用固定大小系統記憶體。
(2)使用開啟大頁場景
共享記憶體設定超過8G+,並且需要做大資料處理,保障資料儘量在記憶體中不會被經常swap
(3)檢視系統頁大小和系統塊大小
getconf PAGESIZE
tune2fs -l /dev/sda1 |grep 'Block size'
(4)大頁預設大小以及數量設定
大頁的預設大小是2M,可透過/etc/sysctl.conf vm.nr_hugepages = 9732設定大頁的數量,總的大頁大小是9732*2/1024=19G
1、檢視系統記憶體的使用情況
從中可以看到系統記憶體總大小是31G,已使用21G,空閒9G,cache的2G,swap暫未使用
點選(此處)摺疊或開啟
-
free -g
-
total used free shared buffers cached
-
Mem: 31 21 9 0 0 2
-
-/+ buffers/cache: 19 11
- Swap: 3 0 3
透過top簡單M按照記憶體使用情況排序看,系統記憶體使用最大的也就245M,總體使用不會超過19G
點選(此處)摺疊或開啟
-
top - 17:59:04 up 6:44, 1 user, load average: 0.00, 0.00, 0.00
-
Tasks: 199 total, 1 running, 197 sleeping, 0 stopped, 1 zombie
-
Cpu(s): 0.1%us, 0.2%sy, 0.0%ni, 99.6%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
-
Mem: 32864556k total, 22515836k used, 10348720k free, 71220k buffers
-
Swap: 4128760k total, 0k used, 4128760k free, 2101028k cached
-
-
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
-
2892 oracle 20 0 211m 13m 9888 S 0.0 0.0 0:01.16 tnslsnr
-
2978 oracle 20 0 211m 13m 9888 S 0.0 0.0 0:01.17 tnslsnr
-
1353 root 20 0 53088 9312 6396 S 0.0 0.0 0:00.02 VGAuthService
-
1332 root 20 0 164m 7784 4572 S 0.0 0.0 0:12.95 vmtoolsd
-
1423 root 20 0 199m 5244 4344 S 0.0 0.0 0:07.58 ManagementAgent
-
72153 root 20 0 98.1m 4016 3028 S 0.0 0.0 0:00.24 sshd
-
72157 root 20 0 105m 1960 1544 S 0.0 0.0 0:00.14 bash
- 1550 root 20 0 245m 1744 1104 S 0.0 0.0 0:00.11 rsyslogd
檢視所有PID使用的記憶體最大值以及當前值
點選(此處)摺疊或開啟
- for pid in `ls /proc/|grep "^[0-9]"`; do echo $pid;cat /proc/${pid}/status|grep VmPeak|awk -F':' '{print $2}'|grep -v "^$|^#"|sort -nk 1 ; done
for pid in `ls /proc/|grep "^[0-9]"`; do echo $pid;cat /proc/${pid}/status|grep RSS|awk -F':' '{print $2}'|grep -v "^$|^#"|sort -nk 1 ; done
由於這些伺服器是虛擬機器,我懷疑是不是由於實體記憶體的共享導致的記憶體佔用呢? (由於宿主機不在我這,所以這個不好排查)
或者會不會是某個記憶體佔用,未釋放導致的系統記憶體被佔用?(經過重啟伺服器,發現系統記憶體在啟動即被佔用19G)
亦或者是某個系統引數設定導致系統記憶體被啟動就分配佔用?(聯想到hugepage可能會導致此類問題)
5、檢查hugepage是否開啟
# cat /sys/kernel/mm/redhat_transparent_hugepage/enabled (其他非rhel linux 可使用cat /sys/kernel/mm/transparent_hugepage/enabled)
[always] madvise never
發現系統開啟了透明大頁,透過下面命令進一步確認
# cat /proc/meminfo | grep -i huge
AnonHugePages: 0 kB
HugePages_Total: 9732
HugePages_Free: 9732
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
6、關閉Hugepage,釋放記憶體
vi /etc/sysctl.conf
#vm.nr_hugepages = 9732 將大頁數量的配置註釋掉或者刪除,然後透過sysctl -p使其生效
vi /etc/security/limits.conf
#oracle soft memlock unlimited ##使用者記憶體鎖限制註釋掉
#oracle hard memlock unlimited
重啟OS,檢查系統記憶體是否正常,大頁是否關閉
free -g
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
cat /proc/meminfo | grep -i huge
7、Hugepage附錄
(1)開啟hugepage優缺點
優點:提高TLB的命中率、利用HugePages不會被Swap 的特性保證記憶體不會被交換到Swap中
缺點:佔用較大的系統記憶體,即時不起任何應用的情況下,也會佔用固定大小系統記憶體。
(2)使用開啟大頁場景
共享記憶體設定超過8G+,並且需要做大資料處理,保障資料儘量在記憶體中不會被經常swap
(3)檢視系統頁大小和系統塊大小
getconf PAGESIZE
tune2fs -l /dev/sda1 |grep 'Block size'
(4)大頁預設大小以及數量設定
大頁的預設大小是2M,可透過/etc/sysctl.conf vm.nr_hugepages = 9732設定大頁的數量,總的大頁大小是9732*2/1024=19G
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27067062/viewspace-2136142/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 造成記憶體洩漏的異常處理記憶體
- 記憶體分配問題處理記憶體
- 一個SMMU記憶體訪問異常的問題記憶體
- .net異常處理的效能問題
- HIVEMapJoin異常問題處理總結Hive
- EJB3的異常處理問題
- 使用RAMMap+PoolMon分析Windows記憶體異常使用問題Windows記憶體
- java異常處理筆記Java筆記
- 一個由程式記憶體佈局異常引起的問題記憶體
- mysql 記憶體表The table 'pvlogs' is full問題處理MySql記憶體
- JavaScript 工作原理之三-記憶體管理及如何處理 4 類常見的記憶體洩漏問題(譯)JavaScript記憶體
- Java記憶體模型常見問題Java記憶體模型
- 異常篇——異常處理
- SVN異常處理——禁止訪問
- Linux記憶體不足的處理方法Linux記憶體
- 記錄Laravel異常處理類Laravel
- UE4 記憶體寫壞導致異常崩潰問題記錄記憶體
- 異常處理
- JAVA記憶體區域與記憶體溢位異常Java記憶體溢位
- 【問題備忘錄】記一次DNS解析異常現象處理DNS
- 記一次網路異常緩慢問題核查處理過程
- Linux核心筆記005 - 越界訪問記憶體,Linux核心處理過程Linux筆記記憶體
- crontab導致CPU異常的問題分析及處理
- 請問EJB容器如何處理異常
- 異常處理 - Go 學習記錄Go
- 異常處理-PHP手冊筆記PHP筆記
- [轉載] Java異常處理習題Java
- 異常-throws的方式處理異常
- 異常處理與異常函式函式
- Linux crontab job 中的log記錄及異常處理Linux
- 利用異常表處理Linux核心態缺頁異常(轉)Linux
- JavaScript 異常處理JavaScript
- ThinkPHP 異常處理PHP
- React 異常處理React
- 08、異常處理
- JAVA 異常處理Java
- JAVA異常處理Java
- Abp 異常處理