乐趣区

Linux下如何确定进程是否使用了大内存

如为 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
退出移动版