最近一台装有Rhel5.3的40G内存的机器上有一个oracle数据库,数据库的SGA设置为20G,当运行业务时,一个业务高峰期时,发现swap频繁交换,CPU 100%,Load很高,基本体现为内存不足。此时的连接数在600个左右。按内存的计算:每个连接占用内存基本在5M,这样600个连接只占用3G内存,SGA内存20G,操作系统占用内存1G,这样总占用的内存为24G,而总共内存有40G,怎么会内存不足呢?当时是百思不得其解,于是做了大量的压力测试,首先是写了一个java程序,启动多个线程,每个线程与数据库建一个连接,然后循环运行一个简单的SQL,这个SQL按一个随机函数生成的ID去查询一个很大的表(有索引)。当启动1000个连接后,使用free -m查看内存:

 
#free -m
             total       used       free     shared    buffers     cached
Mem:         40210      25842      14368          0          9        177
-/+ buffers/cache:      25655      14554
Swap:        20481        479      20001
 
发现free的内存值很小,used的内存值为断增长,运行大约20分钟后,当free减少到40M左右的时候, 系统的CPU一下子到100%,Load从15升到600。
从这个结果看到,还是内存不足,当时还写了一个脚本,查看所有oracle进程的内存情况,也没有发现oracle进程占用内存太多。所以一直没有找到原因。
 
最后试着用cat /proc/meminfo查看内存时,终于找到了原因,没有加压力时,cat /proc/meminfo看到的结果为:
root@xxxx:/proc/sys/vm>cat /proc/meminfo
MemTotal:     41175744 kB
MemFree:      27603324 kB
Buffers:         36572 kB
Cached:       13006240 kB
SwapCached:     232980 kB
Active:         304448 kB
Inactive:     12990616 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:     41175744 kB
LowFree:      27603324 kB
SwapTotal:    20972816 kB
SwapFree:     20070348 kB
Dirty:            1232 kB
Writeback:           0 kB
AnonPages:      240500 kB
Mapped:         354120 kB
Slab:           136980 kB
PageTables:      34004 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:  41560688 kB
Committed_AS: 17163928 kB
VmallocTotal: 34359738367 kB
VmallocUsed:    273756 kB
VmallocChunk: 34359464051 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB
 
当压力上来时:
root@bopspri:/proc/sys/vm>cat /proc/meminfo
MemTotal:     41175744 kB
MemFree:        375212 kB
Buffers:         36444 kB
Cached:       13005200 kB
SwapCached:     232984 kB
Active:       16919192 kB
Inactive:       509908 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:     41175744 kB
LowFree:        375212 kB
SwapTotal:    20972816 kB
SwapFree:     20070340 kB
Dirty:             184 kB
Writeback:           0 kB
AnonPages:     4375088 kB
Mapped:       12889760 kB
Slab:           168916 kB
PageTables:   23005464 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:  41560688 kB
Committed_AS: 40413008 kB
VmallocTotal: 34359738367 kB
VmallocUsed:    273756 kB
VmallocChunk: 34359464051 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB
 
可以看到压力上来后,PageTables占用的内存居然高达23G。PageTables是Linux下虚拟内存到物理内存中做映射时映射表占用的空间,这个映射表居然占用了这么大的内存,真让人不可思议。
 
为了解决这个问题,想到了Linux的大页管理,正常的页大小为4k,而大页管理的页大小为2M,通过大页管理后,映射表占用的空间将会大大减少。
 
于是把数据库停了,启动大页管理,给大页管理分配20G内存:
echo 10240 > /proc/sys/vm/nr_hugepages
 
增加
root                soft    memlock -1 
root                hard    memlock -1
oracle              soft    memlock -1 
oracle              hard    memlock -1
 
把数据库的lock_sga改成true后,再做压力测试,系统终于能稳定运行了,free -m查看到的空闲内存一直空闲13G:
root@xxxx:/etc/security>free -m
             total       used       free     shared    buffers     cached
Mem:         40210      26234      13976          0         20        184
-/+ buffers/cache:      26029      14181
Swap:        20481        479      20001
 
http://www.cnblogs.com/woxing/p/3854178.html

大并发连接的oracle在Linux下内存不足的问题的分析(转)的更多相关文章

  1. 大并发连接的oracle在Linux下内存不足的问题的分析

    大并发连接的oracle在Linux下内存不足的问题的分析 2010-01-28 20:06:21 分类: Oracle 最近一台装有Rhel5.3的40G内存的机器上有一个oracle数据库,数据库 ...

  2. 推荐:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求

    推荐一个比较好用的流媒体服务开源代码: ZLMediaKit: 实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求 https://gitee.com/xiahcu/Z ...

  3. Linux下内存查看命令

    在Linux下面,我们常用top命令来查看系统进程,top也能显示系统内存.我们常用的Linux下查看内容的专用工具是free命令. Linux下内存查看命令free详解: 在Linux下查看内存我们 ...

  4. Linux下内存查看及详解

    在Linux下面,我们常用top命令来查看系统进程,top也能显示系统内存.我们常用的Linux下查看内容的专用工具是free命令. Linux下内存查看命令free详解: 在Linux下查看内存我们 ...

  5. Linux下内存映射文件的用法简介

    由于项目需要,所以学习了一下Linux下内存映射文件的用法,在这里共享一下自己的收获,希望大家提出宝贵意见,进行交流. 简介: 内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区 ...

  6. linux下利用elk+redis 搭建日志分析平台教程

    linux下利用elk+redis 搭建日志分析平台教程 http://www.alliedjeep.com/18084.htm   elk 日志分析+redis数据库可以创建一个不错的日志分析平台了 ...

  7. Linux下USB suspend/resume源码分析【转】

    转自:http://blog.csdn.net/aaronychen/article/details/3928479 Linux下USB suspend/resume源码分析 Author:aaron ...

  8. DEBUG模式下, 内存中的变量地址分析

    测试函数的模板实现 /// @file my_template.h /// @brief 测试数据类型用的模板实现 #ifndef MY_TEMPLATE_H_2016_0123_1226 #defi ...

  9. Oracle在Linux下的性能优化

    Oracle数据库内存参数的优化 Ø       与oracle相关的系统内核参数 Ø       SGA.PGA参数设置   Oracle下磁盘存储性能优化 Ø       文件系统的选择(ext2 ...

随机推荐

  1. XMPPclient库Smack 4.0.6一个版本的开发

    XMPPclient库Smack 4.0.6版开发之中的一个 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.Smack库概述 Smack是一个开源. ...

  2. jfinal常见问题

    2014年的时候,学过一段时间的JFinal,当时主要是了解这个框架,研究了下源码,看懂了部分.今天,2015年2月7日,弄了一下午的JFinal,把未来要上线的一个官网项目,迁移到了JFinal.下 ...

  3. io端口

    io端口 ***********************************************************   io端口设备访问流程为 --------------------- ...

  4. Mysql iot表

    我们知道一般的表都以堆(heap)的形式来组织的,这是无序的组织方式. Oracle还提供了一种有序的表,它就是索引组织表,简称IOT表.IOT表上必须要有主键,而IOT表本身不对应segment,表 ...

  5. Android WebView挂马漏洞--各大厂商纷纷落马

    本文章由Jack_Jia编写,转载请注明出处.   文章链接: http://blog.csdn.net/jiazhijun/article/details/11131891 作者:Jack_Jia ...

  6. C++ 直方图匹配算法代码

    /*-------------------------------------------------------------------------*/ // 函数名称: histeq() // 传 ...

  7. 《转》如何成为一个牛逼的C/C++程序员?

    原地址:http://blog.csdn.net/langeldep/article/details/6333562 这个题目的噱头太大,要真的写起来, 足够写一本书了. 本人是过来人, 结合自身的体 ...

  8. [Cocos2d-x]Android的android.mk文件通用版本

    原文地址: http://blog.ready4go.com/blog/2013/10/12/update-android-dot-mk-with-local-src-files-and-local- ...

  9. android app 架构设计02

    二:在开放的过程中,尽量把工具类,BaseActivity 放在指定的位置. DateFormat Bitmap Notification Shared Preference Environment ...

  10. HelloGithub

    <HelloGithub月刊>第一期   <HelloGithub月刊> 因为现在这个项目只有我自己做,只敢叫“月刊”,希望有志同道合者,快点加入到这个项目中来!同时,如果您有 ...