如为 oracle 配置了大内存,重启 oracle 实例可在 alter 告警日志中观察是否实例使用了大内存,但是否有其他方式确定某个进程使用了大内存呢,下面以 oracle 为例来说明如何从系统侧获知进程是否使用了大内存。
如 oracle sga 配置为 200G:
SQL> show parameter sga
sga_target big integer 200G
系统配置大内存情况:
% cat /etc/sysctl.conf
vm.nr_hugepages = 110080
vm.hugetlb_shm_group = 5001
当前大内存使用情况:(110080-7166)*2/1024=201G。
% grep HugePages_ /proc/meminfo
HugePages_Total: 110080
HugePages_Free: 7166
HugePages_Rsvd: 0
HugePages_Surp: 0
系统有如下数据库,进程如下所示:
% ps -ef|grep pmon_
grid 111896 1 0 Jan14 ? 00:00:34 asm_pmon_+ASM1
oracle 114732 1 0 Jan14 ? 00:00:54 ora_pmon_db1
grid 248262 1 0 Jan14 ? 00:00:18 mdb_pmon_-MGMTDB
那么,我们可使用如下命令或者进程使用的大内存情况:
# db1 实例使用了 200G 大内存:% grep -B 11 'KernelPageSize: 2048 kB' /proc/114732/smaps \
| grep "^Size:" | awk 'BEGIN{sum=0}{sum+=$2}END{print"gb: "sum/1024/1024}'
gb: 200.002
# MGMTDB 实例使用了 1G 大内存:% grep -B 11 'KernelPageSize: 2048 kB' /proc/248262/smaps \
| grep "^Size:" | awk 'BEGIN{sum=0}{sum+=$2}END{print"gb: "sum/1024/1024}'
gb: 1.00195