v
HeapAnalyzer/HeapRoots是一款针对IBM JDK的内存文本镜像HeapDump的分析工具
特性:
– 离线分析,不影响生产系统
– 需要得到IBM JDK内存镜像
– 只支持IBM JDK
– HeapRoots字符界面,HeapAnalyzer是HeapRoots的图形界面
启动方式:
– Kill -3 <pid>得到heapdump文件
– 启动HeapAnalyzer或者HeapRoots,加载heapdump文件
– 图形化分析
HeapDump是IBM JDK Heap内存的一个文本镜像,默认生成位置在Weblogic Server启动目录下,通常是Domain目录
如果得不到HeapDump,可能是禁止生成
HeapDump的生成开关
– export IBM_HEAPDUMP=true
– export IBM_HEAP_DUMP=true
– export IBM_HEAPDUMP_OUTOFMEMORY=true
– export IBM_JAVADUMP_OUTOFMEMORY=true
– export IBM_JAVACORE_OUTOFMEMORY=true
– export IBM_HEAPDUMPDIR=<directory_path>
注意:
– 通常HeapDump会比较大,尤其是在Heap内存设置很大的情况下
– 为了重现问题,得到现场数据,建议先把HeapDump调小,推荐1G以下
– 在Window上,如果HeapDump大于1G,可能会无法打开,出现OOM错误
– 启动HeapAnalyzer需要指定-Xmx参数
启动界面
内存按树状引用关系显示
内存按对象和类型显示
找到怀疑泄漏的内存对象
预防出现OOM,需要注意的地方:
系统管理
– 足够的物理内存,设置适当的Swap区大小
– 最佳的HEAP内存设置
– 使用最新的 *** 作系统/最新的JDK/最新版本的WLS
– 使用Weblogic Server认证的JDK
– 尽量少使用第三方本地代码,或使用Java替代方案
– 根据应用设置适当的>
数据库慢一般有三种情况
逐渐变慢
突然变慢
不定时变慢
第一种情况 逐渐变慢 要建立一个长期的监控机制 比如 写个shell脚本每天的忙时(通常 ~ etc )定时收集os neork db的信息 每个星期出report对收集到的信息进行分析 这些数据的积累 可以决定后期的优化决策 并且可以是DBA说服manager采用自己决策的重要数据 DBA的价值 就在每个星期的report中体现
第二种情况 突然变慢 也是最容易解决的 先从业务的角度看是DB的使用跟以前有何不同 然后做进一步判断 硬件/网络故障通常也会引起DB性能的突然下降
第一步: 察看DB/OS/NEORK的系统log 排除硬件/网络问题
第二步 察看数据库的等待事件 根据等待事件来判断可能出问题的环节 如果 没有等待事件 可以排除数据库的问题 如果有等待时间 根据不同的等待事件 来找引起这些事件的根源
比如latch free等跟SQL parse有关系的等待事件 OS的表现是CPU 的占用率高
db file scattered read等跟SQL disk read有关系的等待时间 OS的表现是iostat可以看到磁盘读写量增加
第三步: 察看os的信息 CPU/IO/MEMORY等
a Cpu 的占用率
CPU占用率与数据库性能不成反比 CPU占用率高 不能说明数据库性能慢 通常情况 一个优化很好 而且业务量确实很大的数据库 CPU的占用率都会高 而且会平均分布在每个进程上 反过来 CPU的占用率都会高也不代表数据库性能就好 要结合数据库的等待事件来判断CPU占用率高是否合理
如果某个进程的cpu占用高 肯定是这个进程有问题 如果 不是oracle的进程 可以让application察看是否程序有死循环等漏洞 如果 是oracle的进程 可以根据pid查找oracle数据字典看看这个进程的发起程序 正在执行的sql语句 以及等待事件 然后 不同情况使用不同的方法来解决
b IO
排除硬件的IO问题 数据库突然变慢 一般来说 都是一个或几个SQL语句引起的
如果IO很频繁 可以通过优化disk reads高的TOP SQL来解决 当然这也是解决IO问题的最笨也是最有效的办法
OS以及存储的配置也是影响IO的一个重要的原因
比如 最常见的HP unix下异步IO的问题 如果DBA GROUP没有MLOCK的权限 ORACLE是不使用AIO的 偏偏OS与DB的两方的admin如果配合不够好地话 这个配置就很容易给漏掉了
c Memory
第二种情况与memory的关系比较小 只要SGA区配置合理没有变化 一般来说 只要不是Application Memory leak 不会引起突然变慢的现象
第三种情况 不定时变慢 是最难解决的 现场出现的问题原因也是五花八门千奇百怪 最重要的是 出现慢的现象时 以最快的速度抓取到最多的信息以供分析 先写好抓取数据的shell 脚本 并在现象发生时及时按下回车键
一个例子
数据库突然变慢
背景: 一个新应用上线后 数据库突然变慢
第一步 调查新应用
据开发人员讲新应用访问的都是新建立的表 表的数据量很小 没有复杂的SQL查询
查询 v$sqlarea 分别按照disk_reads / buffer_gets / executions 排序 TOP SQL 中没有新应用的SQL 排除新应用数据库访问照成的性能问题
第二步 察看数据库log/ OS log
数据库log中可以看到大量的ORA 错误 以及大量的dump文件 分析dump文件(时间久了 没有dump文件可参考 具体细节没法描述下来 ) 发现是新应用通过dblink访问remote DB时生成的dump文件 应用开发人说没法修改 Oracle也没有相应的patch解决
OS log中没有错误信息
第三步 察看statspack report
从wait events中看到 Top event是 buffer busy waits db file parallel write 等于IO相关的等待事件
从buffer busy waits 的统计信息来看 是等待data block
还有些physical reads等信息与从前比没有太多的异常
Tablespace 的IO reads/writes也没有异常 但是wait明显增加
初步确定是IO问题
第四步 察看OS的信息
top 命令(输出为实验室数据 仅作格式参考)
load averages: : :
processes: sleeping zombie stopped on cpu
CPU states: % idle % user % kernel % iowait % swap
Memory: M real M free M swap in use M swap free
PID USERNAME THR PRI NICE SIZE RES STATE TIME CPU MAND
a K K cpu/ : % top
mpgj M K sleep : % view_server
当时现场数据显示 iowait 值与以前相比大很多 没有异常进程
sar –d (输出为实验室数据 仅作格式参考)
SunOS sc Generic_ sun u / /
: : device %busy avque r+w/s blks/s avwait avserv
sd
sd a
sd b
sd c
sd g
当时现场数据显示 放数据文件的设备 avwait avque blks/s值偏大
第五步 察看数据库的等待事件
一个大业务量的数据库如果性能不好的话 一般来说都会有大量的等待事件 上百个等待事件很常见 我通常会按照EVENT进行group
Select count() event from v$session_wait where event not in ( on timer pmon timer rdbms ipc message SQLNet message from client ) group by event order by desc;
输出结果显示最多的等待事件是buffer busy waits
进一步分析 找出等待的原因
Select count() p p p from v$session_wait where event = buffer busy waits group by p p p ;
在buffer busy waits等待事件中
P = file#
P = block#
P = id ( 此id对应为等待的原因)
按照p p p group是为了明确buffer busy waits的等待集中在哪些对象上
Metalink对buffer busy waits等待事件的描述有如下一段话
If P shows that the buffer busy wait is waiting for a block read to plete then the blocking session is likely to be waiting on an IO wait (eg: db file sequential read or db file scattered read for the same file# and block#
输出结果显示 等待分布在多个不同的对象上 等待原因为 waiting for a block read to plete 进一步分析为IO的问题
如果 buffer busy waits等待集中在某个对象上 说明有hot block 通过重新rebuild这个对象增加freelist来解决 RAC环境增加freelist group
通过以下SQL可以找到具体的object
Select owner segment_name segment_type from dba_extents where file_id=P and P beeen block_id and block_id+blocks;
P P 是上面v$session_wait查出的具体的值
第六步 明确原因 找出解决步骤
分析
磁盘的IO流量增加
磁盘的IO等待增加
DB的IO流量没有增加
DB的IO等待增加
由 可以推出 有数据库以外的IO访问磁盘
察看磁盘配置 该VG只存放了数据库数据文件和数据库系统文件 排除数据文件 产生IO的是数据库系统文件
数据库系统文件一般来说不会产生IO 有IO读写的地方只有log和dump文件
结论 ora 产生的大量core dump文件堵塞IO
解决办法
消除ora (应用不改的情况下 无法解决)
把dump目录指向别的VG
让oracle尽量少的去写core dump文件
background_core_dump = partial
lishixinzhi/Article/program/Oracle/201311/18969
Oracle 主要配置文件介绍
profile文件 oratab 文件 数据库实例初始化文件 initSID ora 监听配置文件 sqlnet ora 文件 tnsnames ora 文件
Oracle 主要配置文件介绍 /etc/profile 文件 系统级的环境变量一般在/etc/profile 文件中定义 在 CAMS 系统 与数据库 相关的环境变量就定义在/etc/profile 文件中 如下所示 export ORACLE_BASE=/u /app/oracle export ORACLE_HOME=$ORACLE_BASE/product/ export PATH=$PATH:$ORACLE_HOME/bin export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib export ORACLE_SID=cams export ORACLE_TERM=vt export ORA_NLS =$ORACLE_HOME/omon/nls/admin/data export NLS_LANG=AMERICAN ZHS CGB & 说明 配置上述环境变量要注意定义的先后顺序 如 定义 ORACLE_HOME 时 用 到 了 ORACLE_BASE 那 么 ORACLE_HOME 的 定 义 应 该 在 ORACLE_BASE之后 在使用中文版 CAMS 时 环境变量 NLS_LANG 的值应该设置为 AMERICAN ZHS CGB 如上所示 在使用英文版 CAMS时 可 以不设置 NLS_LANG 即去掉 export NLS_LANG= 那一行 也可以 设置 NLS_LANG 的值为 AMERICAN_AMERICA US ASCII
/etc/oratab 文件 /etc/oratab 文件描述目前系统中创建的数据库实例 以及是否通过 dbstart 和 dbshut 来控制该实例的启动与关闭 如下所示 忽略以#开头的注释部分 : cams:/u /app/oracle/product/ :Y 其中 cams 为实例 ID /u /app/oracle/product/ 为 ORACLE_HOME目 录 Y表示允许使用 dbstart和 dbshut 启动和关闭该实例数据库 如果设置为 N 表示不通过 dbstart 和 dbshut 启动和关闭实例数据库 CAMS 系统要求在 安装完 ORACLE 后要求将该参数修改为 Y 以保证 ORACLE 数据库自启动 和关闭
数据库实例初始化文件 initSID ora 每个数据库实例都有一个初始化 参数文件 其缺省 存放的路径为 $ORACLE_BASE/admin/<SID>/pfile 其名称为 init<SID> ora 如 cams 实 例 对 应 的 参 数 文 件 为 initcams ora 缺 省 存 放 路 径 为 $ORACLE_BASE/admin/cams/pfile 即/u /app/oracle/admin/cams/pfile 但 在 CAMS 应 用 中 initcams ora 的 存 放 路 径 为 /u /app/oracle/admin/cams/pfile 这是基于数据与应用程序分开存放更好地 保护数据考虑的 尤其在 CAMS 双机应用模式下 能够保证数据的一致性 具体的修改 *** 作可参考 Linux与 Oracle 安装手册 初始化参数文件是一个包含实例配置参数的文本文件 这些参数被设置为特 定的值 用于初始化 Oracle 实例的多数内存和进程设置 以下是一些主要参 数的说明 实例的数据库名称 db_name = cams 实例名称 instance_name = cams 数据库控制文件的名称和位置 control_files = ( /u /app/oracle/oradata/cams/control ctl /u /app/oracle/oradata/cams/control ctl /u /app/oracle/oradata/cams/control ctl ) 调度作业队列的 SNP 进程的数量以及 SNP 进程觉醒时间间隔 秒 JOB_QUEUE_PROCESSES= JOB_QUEUE_INTERVAL=
存储追踪和告警文件的路径 user_dump_dest 指定记录 Oracle 用户进程产生的追踪和告警信息的文件的 存放路径 background_dump_dest 指定记录 Oracle 后台进程产生的追踪和 告警信息的文件的存放路径 core_dump_dest指定Oracle运行所产生的core dump 信息的文件的存放路径 background_dump_dest = /u /app/oracle/admin/cams/bdump core_dump_dest = /u /app/oracle/admin/cams/cdump user_dump_dest = /u /app/oracle/admin/cams/udump UTL_FILE_DIR 参数 UTL_FILE_DIR = UTL_FILE_DIR 参数指定一个或多个目录用于 Oracle 应用的文件 I/O 如备 份数据到文件 在 CAMS 系统中将该值设置为 表示可供 Oracle 应 用进行文件 I/O *** 作的目录为任意目录 因此 只要空间允许 可以将备份数 据存放到任意目录下
监听配置文件 为了使得外部进程 如 CAMS后台程序 能够访问 Oracle 数据库 必须配 置 Oracle 网络服务器环境 配置 Oracle 网络服务器环境是通过配置 listener ora sqlnet ora 和 tnsnames ora 共三个文件来进行的 listener ora 即监听配置文件 在本小节说明 另两个文件分别在随后的两个小节说明 监听配置文件 listener ora 的存放路径为 $ORACLE_HOME/neork/admin 以下是一个示例 LISTENER = #监听器名称 (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC)) ) (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (HOST = localhost localdomain) (PORT = )) ) ) (DESCRIPTION = (PROTOCOL_STACK = (PRESENTATION = GIOP) (SESSION = RAW) ) (ADDRESS = (PROTOCOL = TCP) (HOST = localhost localdomain) (PORT = ))
) ) SID_LIST_LISTENER = #命名规则 SID_LIST_+上面定义的监听器名称 (SID_LIST = (SID_DESC = (SID_NAME = PLSExtProc ) (ORACLE_HOME = /u /app/oracle/product/ ) (PROGRAM = extproc) ) (SID_DESC = (GLOBAL_DBNAME = cams) (ORACLE_HOME = /u /app/oracle/product/ ) (SID_NAME = cams) ) (SID_DESC = (GLOBAL_DBNAME = oid) (ORACLE_HOME = /u /app/oracle/product/ ) (SID_NAME = oid) ) )
& 说明 listener ora 文件中定义一个监听器 其缺省的名称为 LISTENER 这个监听器缺省以tcp/ip为协议地址且端口号为 运行 在CAMS应用中监听文件定义的监听器就使用这个缺省名字 并且使用缺省的协议 tcp/ip和缺省的端口号 待配置好监听文件以及随后说明的 sqlnet ora 和tnsnames ora 文件之后 就可以用以下命令将监听文件中定义的监听器启动起来 $ lsnrctl start停止监听器的命令为 $ lsnrctl stop监测监听器当前状态的命令为 $ lsnrctl status当 lsnrctl status 命令有如下输出结果 STATUS of the LISTENER Alias LISTENER Version TNSLSNR for Linux: Version Production Start Date JAN : : Uptime days hr min sec 就说明监听器正在运行 否则说明监听器已经停止了 CAMS 系统的后台程序的正常运行不仅依赖于数据库实例的运行 还依赖于这个数据库监听器的运行 假如监听器没有启动 即使数据库已经启动 CAMS 后台程序仍然不能正常工作 如(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))所示的一个IPC 协议地址的监听 是为了外部进程调用用的 在数据库安装时自动设定不需要改动
在监听文件后部还有一个 SID_LIST_LISTENER 段 该段用于定义监听器的服务 即为哪些数据库实例提供监听服务 以 cams 实例为例 其对应的服务信息为 (SID_DESC = (GLOBAL_DBNAME = cams) #数据库名 (ORACLE_HOME = /u /app/oracle/product/ ) (SID_NAME = cams) #数据库实例名)
sqlnet ora 文件 sqlnet ora 文件的存放路径为 $ORACLE_HOME/neork/admin 以下是一 个示例
NAMES DEFAULT_DOMAIN = localdomainNAMES DIRECTORY_PATH= (TNSNAMES ONAMES HOSTNAME) & 说明 NAMES DEFAULT_DOMAIN 指定网络域名 NAMES DIRECTORY_PATH指定当解析客户端连接标识符时命名方法 naming metthods 采用的优先顺序 从左至右递减 在 CAMS 应用中 这两个参数采用上述所示的系统缺省值
tnsnames ora 文件tnsnames ora 文件的存放路径为 $ORACLE_HOME/neork/admin 以下是一个示例OID LOCALDOMAIN = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost localdomain)(PORT = )) ) (CONNECT_DATA = (SERVICE_NAME = oid) ) )CAMS LOCALDOMAIN = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost localdomain)(PORT = )) ) (CONNECT_DATA = (SERVICE_NAME = cams) ) )INST _>
NET Core是一个开源的跨平台框架,对于分库分表问题,通常有以下两种解决方案。
1 手动实现分库分表
手动实现分库分表是一种常见的解决方案,可以自己设计数据分片规则和数据迁移策略等。根据业务需求和数据量,可以将数据库表按照一定规则拆分成多个逻辑数据库或物理数据库,并且使用分布式事务来保证数据一致性。需要注意的是,手动实现分库分表需要编写大量的代码来完成数据的路由、数据的迁移以及异常处理等,同时还需要考虑大量的细节问题,比如数据位置管理、数据备份和恢复等。
2 使用ORM框架的支持
目前,许多ORM框架已经支持分库分表功能。ORM框架可以将数据库分库分表的细节封装起来,使得开发人员不必自己编写复杂的代码。例如,Entity Framework Core(EF Core)提供了一种称为“Sharding”的分库分表解决方案,可以通过在代码中使用ShardedDbContext来实现分库分表。此外,NHibernate和Dapper也都提供了分库分表的支持。使用ORM框架的优势是可以提高开发效率,并且减少分布式事务的开发难度,但需要注意的是,ORM框架的功能和性能也存在一些局限性,需要仔细评估和测试。
总之,分库分表是一个非常复杂和重要的问题,需要结合具体业务需求和数据量来选择合适的解决方案。无论选择哪种方案,都需要充分测试和评估,以确保系统的性能和可用性。
以上就是关于heapdump文件太大无法分析怎么办全部的内容,包括:heapdump文件太大无法分析怎么办、docker里面的uwsgi不停的生成很大的core文件、数据库变慢的情况及处理方法等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)