一条关于swap争用的报警邮件分析

杨建荣的学习笔记 | 2016-02-09 22:28

最近收到报警,某一个服务器的swap空间有些紧张,查看这台服务器上有两个备库数据库实例,当然负载还是很低的。但是目前来看,内存已经所剩无几,所以自然而然会用到swap,而且swap也看起来紧张了,从设计的角度来看,这种方式还是有很大的隐患,一旦需要切换,这台服务器还是很有可能出现oom-killer的情况,也就意味着宕机。所以从小从大来看这个报警都不能掉以轻心。

使用top查看的情况如下,可以看到swap已经很紧张了,剩余内存不到300M了。

top - 13:46:44 up 973 days, 3:00, 1 user, load average: 0.23, 0.16, 0.10

Tasks: 884 total, 1 running, 880 sleeping, 0 stopped, 3 zombie

Cpu(s): 0.9%us, 0.6%sy, 0.0%ni, 98.5%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

Mem: 65923168k total, 65624684k used, 298484k free, 1256944k buffers

Swap: 33554424k total, 23177916k used, 10376508k free, 60284668k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

6821 oracle 20 0 16.2g 57m 53m S 9.9 0.1 3618:47 ora_rsm0_megdb

4768 oracle 20 0 40.9g 109m 94m S 1.3 0.2 18619:36 ora_dia0_tebdb2

查看当前服务器的数据库实例情况,如下,可以结合上面的情况可以看到SGA应该一个是40G,一个是16G.

[oracle@stepay2 ~]$ ps -ef|grep smon

oracle 4784 1 0 2013 ? 00:24:15 ora_smon_tebdb2

oracle 6738 1 0 2014 ? 00:13:26 ora_smon_megdb

oracle 20793 20706 0 13:47 pts/2 00:00:00 grep smon

进一步查看进行验证,tebdb2的SGA看似没有启用SGA的自动管理。

SQL> show parameter sga

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

lock_sga boolean FALSE

pre_page_sga boolean FALSE

sga_max_size big integer 41472M

sga_target big integer 0

查看megdb的SGA的情况,是使用了SGA的自动管理的。

SQL> show parameter sga

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

lock_sga boolean FALSE

pre_page_sga boolean FALSE

sga_max_size big integer 16G

sga_target big integer 16G

当然PGA也会消耗一些内存,但是这些消耗应该不会成为瓶颈,但是swap的消耗却很高。

为什么SGA+PGA的设置都在范围之内,但是swap却总是不够用呢。

这个时候查看共享内存段的情况,发现其中一个数据库实例40G的SGA貌似没有体现出来。

[oracle@stepay2 trace]$ ipcs -m

------ Shared Memory Segments --------

key shmid owner perms bytes nattch status

0x00000000 294912 oracle 640 4096 0

0x00000000 327681 oracle 640 4096 0

0x4ab8364c 360450 oracle 640 4096 0

0x00000000 1769475 oracle 640 100663296 67

0x00000000 1802244 oracle 640 17079205888 67

0xf6d1ab84 1835013 oracle 640 2097152 67

所以对于这种情况,一种改善思路就是开大页,从目前经历的绝大多数Linux系统来说,大页的设置应该是一个标配.当然Oracle官方也提供了相应的脚本。

我简单来说一下,脚本的思路首先是根据内核版本,目前支持2.4,2.6

[oracle@stepay2 trace]$ uname -r | awk -F. '{ printf("%d.%d\n",$1,$2); }'

2.6

然后得到一个page size的大小,也可以使用root权限通过getconf PAGESIZE来得到。

[oracle@stepay2 trace]$ grep Hugepagesize /proc/meminfo | awk {'print $2'}

2048

然后通过ipcs –m得到共享内存段的情况,然后根据共享内存段的数据来计算需要设置的大页内核参数设置。

[oracle@stepay2 trace]$ ipcs -m | awk {'print $5'} | grep "[0-9][0-9]*"

4096

4096

4096

100663296

17079205888

2097152

因为我们的环境是多实例,我们可以设定一个统一的值,比如我们需要设置50G左右的大页,就可以使用下面的公式进行计算。

MIN_PG=`echo "51200000000/(2048*1024)" | bc -q`

通过上面的公式就会输出最终建议的大页设置

[oracle@stepay2 trace]$ echo "51200000000/(2048*1024)" | bc -q

24414

对应的内核参数在内核2.6就是 vm.nr_hugepages=24414

简单的环境设置交代完毕,然后准备重启备库数据库实例,同时考虑到资源的使用情况,把原来40G的SGA调整为32G,然后把两个实例都停了之后,swap的使用率一下子降下来了。

Tasks: 821 total, 1 running, 817 sleeping, 0 stopped, 3 zombie

Cpu(s): 0.9%us, 0.4%sy, 0.0%ni, 98.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

Mem: 65923168k total, 53194676k used, 12728492k free, 63904k buffers

Swap: 33554424k total, 32812k used, 33521612k free, 1694992k cached

然后我们重启,这个时候发现有一个数据库实例怎么都启动不了。

SQL> startup nomount

ORA-27102: out of memory

Linux-x86_64 Error: 28: No space left on device

一般根据经验这个错误主要都是因为内核参数设置的过小导致。

但是查看了下面的配置,没有发现问题。

kernel.shmmax = 68719476736

kernel.shmall=16777216

fs.aio-max-nr = 1048576

fs.file-max = 6815744

vm.nr_hugepages= 24414

对于这个问题着实感到奇怪,同时查看alert日志也没有看到任何大页开启的信息。为什么大页没有开启呢,而且数据库实例还启动不了。

这个可以从共享内存段的设置情况来做一个简单的佐证。

[oracle@stepay2 ~]$ ipcs -m

------ Shared Memory Segments --------

key shmid owner perms bytes nattch status

0x00000000 2260995 oracle 640 201326592 0

0x00000000 2293764 oracle 640 32010928128 0

发现其中一个设置为32G的共享内存空间已经被使用了,而且更加奇怪的是切换profile使用sqlplus还连接不到这个实例,可见这部分内存空间还没有通过ORACLE_SID和SGA建立映射关系。那么对于这部分缓存空间,可以手工进行清理。

[oracle@stepay2 ~]$ ipcrm -m 2293764

而为什么大页没有开启呢,这个时候反复验证,发现是启用了自动内存管理,明白了这点再来看这个问题一下子就有些恍然大悟了。把这台服务器上相关的服务都停了,然后手工清空了剩余的共享内存段。

[oracle@stepay2 ~]$ ipcs -m

------ Shared Memory Segments --------

key shmid owner perms bytes nattch status

0x00000000 2260995 oracle 640 201326592 0

[oracle@stepay2 ~]$ ipcrm -m 2260995

当然如果条件允许,最好重启一下,如果不能重启还是使用sysctl –p来设置内核参数生效。

然后再次重启就没有任何问题了。

[oracle@stepay2 trace]$ ipcs -m

------ Shared Memory Segments --------

key shmid owner perms bytes nattch status

0x00000000 3506176 oracle 640 100663296 67

0x00000000 3538945 oracle 640 16005464064 67

0xf6d1ab84 3571714 oracle 640 2097152 67

0x00000000 3637251 oracle 640 201326592 66

0x00000000 3670020 oracle 640 32010928128 66

0x4ab8364c 3702789 oracle 640 2097152 66

通过这个细小的案例,我们可以看到其实有些看似细小的警告,如果不加以重视,会逐渐演变为一个大问题。需要提前预警,提前处理。

About Me

....................................................................................................................................................

本文来自于微信公众号转载文章,若有侵权,请联系小麦苗及时删除

ITPUB BLOG:http://blog.itpub.net/26736162

QQ:642808185 若加QQ请注明您所正在读的文章标题

【版权所有,文章允许转载,但须以链接方式注明源地址,否则追究法律责任】

....................................................................................................................................................

时间: 2024-10-23 18:22:25

一条关于swap争用的报警邮件分析的相关文章

一条关于swap争用的报警邮件分析(一)

最近这些天有一台服务器总是会收到剩余swap过低的告警. 邮件内容大体如下: ############ ZABBIX-监控系统: ------------------------------------ 报警内容: Lack of free swap space on ora_test_s2_yangjr@10.127.2.xxxx ------------------------------------ 报警级别: PROBLEM -------------------------------

由报警邮件分析发现的备库oracle bug

昨天到公司之后,收到两份封报警邮件,可以看到在早晨6:30左右主库的v$dataguard_status检查时发现了一个错误.然后再2分钟后就自动恢复了. 一般这种问题很自然想到可能是网络出现了一些问题.因为自动恢复了,所以也不同太着急处理,于是细细看了下.报警邮件如下: ZABBIX-监控系统: ------------------------------------ 报警内容: DG_issue ------------------------------------ 报警级别: PROBL

一条看似平常的报警邮件所做的分析

今天留意到一封报警邮件.内容如下: ZABBIX-监控系统: ------------------------------------ 报警内容: CPU utilization is too high ------------------------------------ 报警级别: PROBLEM ------------------------------------ 监控项目: CPU idle time:45.92 % --------------------------------

备库报警邮件的分析案例(二)

在第一篇中分享了关于备库报警邮件的分析,发现很多问题都是一环扣一环. 起初是通过监控主库中的v$dataguard_status发现备库中可能存在一些问题,结果逐步分析,发现是由备库的crontab触发了备库的定时read-only和online状态,(即只读和应用日志,10gR2的环境),而这些关键信息都是从数据库的alert日志中发现的,但是问题还没有完,才刚刚开始,因为发现备库中竟然有ORA-1652: unable to extend temp segment by 128 in tab

一条空间不足报警的分析

今天下午收到一条报警邮件ZABBIX-监控系统: ------------------------------------报警内容: Free disk space is less than 20% on volume /U01------------------------------------报警级别: PROBLEM------------------------------------监控项目: Free disk space on /U01 (percentage):9.7 % --

一封备库报警邮件的分析

对于orabbix报出的警报,自己都是心怀敬畏,因为这些表面的现象如果深入分析没准就能有所收获,当然目的还是解决问题,不是一味追求指标. 今天收到的报警邮件如下,然后在两分钟后问题自动恢复. ### ZABBIX-监控系统: ------------------------------------ 报警内容: DG_issue ------------------------------------ 报警级别: PROBLEM ----------------------------------

备库报警邮件的分析案例(三)

继前两篇分析了一个看似非常普通的报警邮件,结果在分析问题的时候八面玲珑,相关因素都给分析了一下,没想到还真是有不小的收获. 前两篇地址: http://blog.itpub.net/23718752/viewspace-1827685/ http://blog.itpub.net/23718752/viewspace-1829630/ 最后通过手工定位监控的方式终于把罪魁祸首揪了出来,为什么在备库使用ash无果,因为还是10g的库,还没有这个特性,在11g中才可以.这个也算是在10g中的一个监控

三封报警邮件的分析

今天收到3封报警邮件,从邮件内容中的报警情况来看,还是比较反常的.需要引起关注,找到原因处理. 这个库是一个历史库,库中的数据非常庞大,几十亿数据的表还是有好几个.但是访问频率很低,一般到历史库中所做的历史数据分析查询需求还是要少很多. 报警邮件如下,可以看到DB time的阀值还是很高的. #邮件1 [DB监控系统]_testdb2_hist_p@10.12.6.18_报警 ZABBIX-监控系统: ------------------------------------ 报警内容: DB t

Python监控主机是否存活,并发报警邮件

 利用python写了简单测试主机是否存活脚本,此脚本不适于线上使用,因为网络延迟.丢包现象会造成误报邮件,那么后续会更新判断三次ping不通后再发报警邮件,并启用多线程处理. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #!/usr/bin/env python # coding:UTF-8 import tim