一、問題現象
某客戶現場環境運維,監控告警某臺Oracle db os 內存使用率大于90%,需要進行問題排查;
二、問題診斷
2.1 內存使用率check
Linux free -g check發現free 0,available 0,swap 使用1g swap 配置15G
2.2 檢查是否存在使用過大的內存進程
Linux top 排查忽略
2.3 檢查Oracle數據庫參數
memory_target 0,sga target 4800 Mbytes
OS 16Gbytes
???看到這里,內存去哪了,OS 16G,ORACLE DB SGA只占用4.68G,剩余的12G內存被什么占用了?
2.4 檢查OS 內存大頁的配置
vm.nr_hugepages = 6150 換算成Gbytes12Gbytes
三、問題處理
3.1 減小內存大頁的參數設置
–默認規則是內存大頁設置為SGA換算大頁數量+1, OS Linux默認操作系統內存小頁,頁大小4K,內存大頁默認頁大小2Mbytes
Linux 大頁處于free狀態是可以直接調整減小,可以在線調整! 但是處于使用狀態建議停庫調整或者重啟主機
vi /etc/sysctl.conf
--修改前
vm.nr_hugepages = 6150
--調整后
vm.nr_hugepages = 2500
[root@AsiainfoDS-DB ~]# grep Huge /proc/meminfo
HugePages_Total: 2500
HugePages_Free: 2500
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
看到這里是不是有朋友已經蒙蔽了? 大頁內存怎么都處于Free???
雖然此時OS 釋放出來了(6150-2500)*2/1024=7G,但是作為技術人員要有一定追求,就是直男癌。
會玩的朋友應該已經想到了是什么問題導致的。
3.2 檢查oracle操作系統用戶是否具有內存大頁的使用權限
Oracle 11g db+ db alert數據庫啟動會有一定信息的
Starting ORACLE instance (normal)
************************ Large Pages Information *******************
Per process system memlock (soft) limit = 64 KB
Total Shared Global Region in Large Pages = 0 KB (0%)
Large Pages used by this instance: 0 (0 KB)
Large Pages unused system wide = 4935 (10 GB)
Large Pages configured system wide = 4935 (10 GB)
Large Page size = 2048 KB
RECOMMENDATION:
Total System Global Area size is 4802 MB. For optimal performance,
prior to the next instance restart:
1. Large pages are automatically locked into physical memory.
Increase the per process memlock (soft) limit to at least 4810 MB to lock
100% System Global Area's large pages into physical memory
********************************************************************
從DB alert的日志驗證了Oracle sga根本沒有使用內存大頁,導致OS內存大頁的內存被分配出去+Oracle sga使用OS內存默認小頁,導致OS free沒什么內存,數據庫壓力一上來,Pga或者其它進程使用OS free分分鐘讓OS 內存使用率飆升到90%+
Linux用戶使用大頁的限制,標準設置應該無限制!
#vi /etc/security/limits.conf
* soft memlock unlimited
* hard memlock unlimited
–實際檢查當前環境沒有配置這個參數!!!
解決方法:
1.內存大頁功能關閉,釋放占用的無效的大頁內存給Os free;
2.重啟Oracle db,因為之前已經根據SGA設置了較為合理的內存大頁,重啟庫太麻煩被嫌棄;
3.3 減少或者關閉內存大頁
修改參數
/etc/sysctl.conf
vm.nr_hugepages = 2500 刪除注釋這行記錄
執行sysctl -p,sysctl -a check發現內存大頁無改變
vm.nr_hugepages = 100 調整為200Mbytes的內存大頁占用
# free -g
total used free shared buff/cache available
Mem: 15 1 9 4 5 10
Swap: 15 1 14
[root@AsiainfoDS-DB ~]# grep Huge /proc/meminfo
AnonHugePages: 24576 kB
HugePages_Total: 100
HugePages_Free: 100
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
可以發現OS free 變成9Gbytes, available 變成10G 問題已解決! 結合以前寫的博客,這已經是第四次遇到這類問題了!!! 希望設置內存大頁的小伙伴們都看一下。
參考文章
https://www.cnblogs.com/lvcha001/p/13356991.html




