一个间歇性进程hang问题的处理

症状:

1、amms进程间歇性hang住,引起登网成功率下降

2、amms进程下所有工作线程均hang住,pstack显示如下:

-----------------  lwp# 41 / thread# 41  --------------------
 feedb075 read     (b6, b2625d80, 8)
 fe58e904 __1cDhpiEread6FipvI_I_ (b6, b2625d80, 8) + a0
 fe58fa72 JVM_Read (b6, b2625d80, 8) + 36
 b2f5b1ff Java_java_net_SocketInputStream_socketRead0 (a30f518, b2627dbc, b2627dc0, b2627de0, 0, 8) + 137
 fb498e62 ???????? (bd23ad10, 0, 8, 0, a30f400, bd23ad28)
 fb4c7820 ???????? ()

根据经验,对于OLTP生产系统,业务侧大量的socket读超时可能跟数据库有关。于是,将问题处理引导至数据库方向。果然,发现数据库(solaris10+oracle10g RAC)有如下异常:

1、lgwr进程的cpu占用异常,高达10%(正常应该在1%以下)

2、观察忙时awr报告,log file sync和log file parallel write高达80ms(正常应该在5ms以下)

3、写脚本从应用debug日志amms1.log提取写登网表时间,发现高达300ms(正常应该在10ms以下)

这里看上去像一个数据库的性能问题,果真如此么?

最后经过几个星期的折腾,发现原来是solaris DISM引起的,不用DISM后,问题解决。

注:

1、如何判断当前数据库是否用了DISM技术?

当使用DISM的时候,一个名为ora_dism_sid的进程会随oracle实例启动而启动,随oracle实例关闭而退出。

[[email protected]]ps -ef|grep -v grep|grepdism

root 10633     1  0   Jun 11 ?           0:42 ora_dism_RWDB

这里可以明显看到,oracle用了DISM。

2、oracle 10g什么时候用DISM?

在oracle10g中,如果sga_max_size和sga_target一样大,那么系统不会使用DISM(使用ISM)。如果设置sga_target比sga_max_size小,那么会使用DISM。

3、DISM可能引起什么问题?

DISM可能会引起oracle SGA无法被正常锁定,引起问题。判断方法:

#/usr/sbin/lockstat -A -n 200000 sleep 10

如果有大量的segspt_softunlock或者spt_anon_getpages,那么SGA可能没有被正常锁定。

如果用ISM,那么sga的内存会直接被os锁定,不会有这种问题。

当我们把sga_target改得和sga_max_size一样大并逐一重启实例,确认oracle不再使用DISM后,问题解决,所有症状都消失。awr报告top events恢复如下:

小结:

在系统负载没有明显变化的情况下,看到的cpu和io异常,可能并非由性能问题引起,要多角度多层次综合分析问题。

时间: 2024-09-08 11:11:43

一个间歇性进程hang问题的处理的相关文章

一次进程hang住问题分析。。。

这两天有同学使用数据校验工具时发现进程hang住了,也不知道什么原因,我简单看了看进程堆栈,问题虽然很简单,但能导致程序hang住,也一定不是小问题.简单说明下程序组件的结构,程序由两部分构成,dbchk和dbchk_inner,dbchk采用python代码实现,dbchk_inner采用C语言实现.dbchk负责并发控制,dbchk_inner则负责具体的校验任务.用户通过运行dbchk命令即可达到校验的目的.进程关系如下: $ pstree 18649 dbchk─┬─sh───dbchk

分析Linux内核创建一个新进程的过程【转】

转自:http://www.cnblogs.com/MarkWoo/p/4420588.html 前言说明 本篇为网易云课堂Linux内核分析课程的第六周作业,本次作业我们将具体来分析fork系统调用,来分析Linux内核创建新进程的过程 关键词:fork, 系统调用,进程 *运行环境:** Ubuntu 14.04 LTS x64 gcc 4.9.2 gdb 7.8 vim 7.4 with vundle 分析 分析方法说明 PCB包含了一个进程的重要运行信息,所以我们将围绕在创建一个新进程时

第六周分析Linux内核创建一个新进程的过程

潘恒 原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 task_struct结构: struct task_struct {   volatile long state;进程状态  void *stack; 堆栈  pid_t pid; 进程标识符  unsigned int rt_priority;实时优先级  unsigned int policy;调度策略  struct files

分析Linux内核创建一个新进程的过程

一.原理分析 1.进程的描述 进程控制块PCB——task_struct,为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_struct{ volatile long state; //进程状态,-1表示不可执行,0表示可执行,大于1表示停止 void *stack; //内核堆栈 atomic_t usage; unsigned int flags; //进程标识符 unsigned int ptrace; …… } 2.进程的创

实验六———分析Linux内核创建一个新进程的过程

分析Linux内核创建一个新进程的过程 攥写人:李鹏举  学号:20132201 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ) 本周要求: 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235: 分析fork函数对应的内核处理过

lab6:分析Linux内核创建一个新进程的过程

李俊锋 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验原理 1.进程的定义 进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放.可以认为进程是一个程序的一次执行过程. 2.进程与程序的区别 程序时静态的,它是一些保存 在磁盘上得指令的有序集合,没有任何执行的概念. 进程是一个动态的概念,它是程序执行的过程

实验六:分析Linux内核创建一个新进程的过程

20135108 李泽源 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235: 分析fork函数对应的内核处理过程sys_clone,理解创建一个新进程如何创建和修改task_struct数据结构: 使用gdb跟踪分析一个fork系统调用内核处理函数sys_clone ,验证您对Linux系统创建一个新进程的理解,推荐在实验楼Linux虚拟机环境下完成实验. 特别

《Linux内核分析》 第六节 分析Linux内核创建一个新进程的过程

范闻泽 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验过程 1.删除原来的menu,并clone新的menu,用test_fork.c覆盖test.c 2. make rootfs之后新的内核启动,测试fork功能 3.使用-s -S冷冻内核,准备调试 4.设置断点 5.根据断点,进行跟踪,得到结果 1.以下是执行指令 cd LinuxKernel rm menu -r

linux内核分析 第六周 分析Linux内核创建一个新进程的过程

进程的描述 操作系统的三大管理功能:进程管理.内存管理.文件系统 为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. 进程控制块PCB task_struct:进程状态.进程打开的文件.进程优先级信息 task_struct总体数据结构的抽象: tty:控制台 fs:文件系统 files:文件描述符 mm:内存管理 signal:信号描述 进程的状态: 注意:Linux下,中就绪状态和运行状态都是TASK_RUNNING 一.gdb跟踪分析一个fork系统调