pagetable的使用學習
Oracle資料庫的pagetable的使用
不啟用大頁時
SGA大小: 9504M
PGA大小: 3159M
cat /proc/meminfo |grep PageT
關閉Oracle時的情況
PageTables: 2416 kB
開啟Oracle時的情況
PageTables: 72748 kB
登入一個遠端使用者
PageTables: 81280 kB
查詢一個小表
PageTables: 83856 kB
查詢一個6GB大小的表
PageTables: 99720 kB
按照上一個文章裡面算的
一個GB 會需要 2MB的頁表
那麼可以看到 登入一個遠端使用者後
增長了大約10MB的頁表, 這一塊可能還沒有涉及堆區
然後查詢一個大表, 堆區增長了大約 18MB
與 9GB的堆區 可以對應起來.
開啟大頁
修改資料庫的環境變數
比如我這個機器 10GB的堆區
可以選擇的大小為
5120 就足夠了.
然後還要修改 共享段大小
需要說明 共享段大小應該可以大約記憶體, 這個應該是不限制的
另外要確認 memory_target的引數為 0 避免私用AMM
vim /etc/sysctl.conf
kernel.shmmax = 139586437120
kernel.shmall = 34078720
kernel.shmmni = 4096
vm.nr_hugepages = 5120
增加memlock的設定
注意單位是KB 需要大約SGA區域設定
vim /etc/security/limits.conf
oracle soft memlock 136314880
oracle hard memlock 136314880
機器重啟後
重啟之前的記憶體:
total used free shared
Mem: 30 1 0 9
buffer cache 29g, avaiable 19g
重啟後
total used free
Mem: 30 10 20
關於頁表:
資料庫服務啟動前
PageTables: 2540 kB
啟動後
PageTables: 42420 kB
登入一個遠端使用者
PageTables: 41140 kB
查詢一個小表
PageTables: 41144 kB
查詢一個6GB大小的表
PageTables: 42072 kB
確認在這樣的場景下, 一個大表的查詢可以節約 50MB的頁表使用。
100個併發就可以節約 5GB的記憶體。
如果堆區是 30G的話 就是 15GB的記憶體。
所以啟用大頁 還是非常有必要的。