IT分销/经销数据库Informix

请教:调用informix的api函数后,api函数不返回问题

在调用informix的api后,调用堆栈如下,但就是不返回。导致调用阻塞。

函数堆栈如下:
WS2_32!WSARecv+0x65   
WSOCK32!recv+0x31   
isqlt09a!service1+0xd932   
isqlt09a!service1+0xcaae   
isqlt09a!ifx_int8cmp+0xe441   
isqlt09a!ifx_int8cmp+0x1aab9   
isqlt09a!ifx_int8cmp+0x14002   
isqlt09a!ifx_int8cmp+0x770e   
isqlt09a!ifx_int8cmp+0x193b   
isqlt09a!CheckOsInit+0x1819   
isqlt09a!CheckOsInit+0x18f7   
isqlt09a!CheckOsInit+0x1db   
isqlt09a!sqli_defprep_set+0x483a
isqlt09a!sqli_prep+0x454   
isqlt09a!sqli_prep+0x1a8   
isqlt09a!sqli_prep+0x3f   
………………
(注:省略部分为我调用informix的api的代码,该代码平时使用是没问题的,只在某些时候出现,怀疑是其他的地方问题导致)

请专家指点一下,不胜感激。谢谢!!

10月27日补充提问
非常感谢大家的回复,我都试过,但都没有得到想要的效果。
  
这个问题在用户那里偶尔重现,重现条件未知。
我希望:1.有办法能重现(能重现才能证明问题的根源再哪里);2.问题原因是什么;3.采取怎样的规避措施
参与40

40同行回答

qdbenzqdbenz其他福涵
缓冲区溢出后,需清共享内存区,否则会影响其它新的线程。重启数据库当然也会生效。STACKSIZE的值偏小,设置成256试一下,看有没有效果。Informix IDS在处理大型查询或高峰负荷的需要增加ADD共享内存时,内存的每次分配需要增加事务处理的时间,所以在设置ADD参数时要注意不能太小。...显示全部
缓冲区溢出后,
需清共享内存区,
否则会影响其它新的线程。
重启数据库当然也会生效。

STACKSIZE的值偏小,
设置成256试一下,
看有没有效果。
Informix IDS在处理大型查询或高峰负荷的需要增加ADD共享内存时,内存的每次分配需要增加事务处理的时间,所以在设置ADD参数时要注意不能太小。
初始值也不要设置得太小。
SHMADD在增加共享内存时,要占用CPU周期;每次的增加量越大,增加次数就越少,留给其它的进程的内存也越少。所以一般采用大的增加量。但是在内存负荷很重时,少量增加使其他程序更好的共享内存资源。
所以,对应主机的实际情况进行调整,如果实际内存<=256MB,则SHMADD=8192KB;
如果256MB如果>=512MB,SHMADD=32768KB。

连接数超过设置数,
虽然会出现等待的现象,
但一般不会造成应用不能使用现象,
具体的情况最好是时点抓取onstat -g里的详细信息,
包括进程,线程,段等,
才能进一步分析。

故障重现,
太有难度了。收起
IT分销/经销 · 2010-07-23
浏览380
little_stonelittle_stoneCIO武汉高科技公司
to:liaosnet1. 是不是按照以下的方式可以重现该问题:1). 让连接数为100个(已经超过50);2). 让其中的50个连接进行耗时的数据库操作;3). 其他还需要进行数据库操作的连接就需要等待?--------先按这种方式试试。--------但从返回的日志结合代码分析,出现问题时,并发操作数据库的连接并...显示全部
to:liaosnet
1. 是不是按照以下的方式可以重现该问题:
1). 让连接数为100个(已经超过50);
2). 让其中的50个连接进行耗时的数据库操作;
3). 其他还需要进行数据库操作的连接就需要等待?
--------先按这种方式试试。
--------但从返回的日志结合代码分析,出现问题时,并发操作数据库的连接并不多。
--------我当时还设想过是不是socket连接异常中断导致(之前定位过因操作系统连接数限制,导致应用程序连接不上的问题),还用工具将数据库端的连接强行中断,也没重现出来。收起
IT分销/经销 · 2010-07-23
浏览338
liaosnetliaosnet信息分析/架构师gbasedbt.com
1. onstat -u---------------结果:72 active, 128 total, 78 maximum concurrent2. onstat -g ntd--- ...little_stone 发表于 2010-7-22 16:09     当前72已经超过50了~~    可能出现网络连接等待的现象~~BTW:   onstat -a 不输出onstat ...显示全部
1. onstat -u
---------------结果:
72 active, 128 total, 78 maximum concurrent

2. onstat -g ntd
--- ...
little_stone 发表于 2010-7-22 16:09



    当前72已经超过50了~~
    可能出现网络连接等待的现象~~


BTW:   onstat -a 不输出onstat -g 信息~~收起
IT咨询服务 · 2010-07-23
浏览361
little_stonelittle_stoneCIO武汉高科技公司
to:qdbenz如果已经造成了“造成缓冲区溢出”,新建的连接还能正常跑吗?显示全部
to:qdbenz
如果已经造成了“造成缓冲区溢出”,新建的连接还能正常跑吗?收起
IT分销/经销 · 2010-07-22
浏览341
little_stonelittle_stoneCIO武汉高科技公司
to:qdbenz1. 你倒提醒了我。这几个参数SHMADD、SHMVIRTSIZE 、STACKSIZE应该都是一样的。但是出现问题的这个用户那里的数据量比其它地方要大。2. 在哪种情况下可能会导致“始STACK缓冲区空间不足后,调用SHMADD多次增加空间后,造成缓冲区溢出”的问题,能否举例说明。我是想能...显示全部
to:qdbenz
1. 你倒提醒了我。这几个参数SHMADD、SHMVIRTSIZE 、STACKSIZE应该都是一样的。但是出现问题的这个用户那里的数据量比其它地方要大。

2. 在哪种情况下可能会导致“始STACK缓冲区空间不足后,调用SHMADD多次增加空间后,造成缓冲区溢出”的问题,能否举例说明。我是想能够重现该问题,并且找到问题的根源及解决方法。

3. 出问题的现场的数据库的配置文件中SHMADD、SHMVIRTSIZE 、STACKSIZE参数的配置如下:
SHMBASE         0xC000000L        # Shared memory base address
SHMVIRTSIZE 196608  # initial virtual shared memory segment size
SHMADD           16384         # Size of new shared memory segments (Kbytes)
SHMTOTAL        0               # Total shared memory (Kbytes). 0=>unlimited

STACKSIZE        64                # Stack size (Kbytes)收起
IT分销/经销 · 2010-07-22
浏览365
qdbenzqdbenz其他福涵
看你说的现象来看,个人觉得不是你应用写的问题,问题出在你的数据库配置上,因为你的应用在一定的时间内还是能正常使用的。通过你说的调用api无响应,看起来象是缓冲区溢出,可能是由于你的堆栈缓冲区设置得太小了吧,最好能与正常使用的客户参照一下,可以查看关于虚拟存储的相关参...显示全部
看你说的现象来看,
个人觉得不是你应用写的问题,
问题出在你的数据库配置上,
因为你的应用在一定的时间内还是能正常使用的。

通过你说的调用api无响应,
看起来象是缓冲区溢出,
可能是由于你的堆栈缓冲区设置得太小了吧,
最好能与正常使用的客户参照一下,
可以查看关于虚拟存储的相关参数:
SHMADD、SHMVIRTSIZE 、STACKSIZE
个人感觉最可能是STACKSIZE设置过小,
SHMADD设置不合理,
造成初始STACK缓冲区空间不足后,
调用SHMADD多次增加空间后,
造成缓冲区溢出。收起
IT分销/经销 · 2010-07-22
浏览354
little_stonelittle_stoneCIO武汉高科技公司
数据库日志(.log)没有发现异常的打印,都是打印Checkpoint的日志。显示全部
数据库日志(.log)没有发现异常的打印,都是打印Checkpoint的日志。收起
IT分销/经销 · 2010-07-22
浏览329
little_stonelittle_stoneCIO武汉高科技公司
1. onstat -u---------------结果:72 active, 128 total, 78 maximum concurrent2. onstat -g ntd---------------这个没有看到数据。我当时onstat -a出来了(因为onstat -a数据比较多,我就不全部贴出来了)。还有哪些信息有用的?...显示全部
1. onstat -u
---------------结果:
72 active, 128 total, 78 maximum concurrent

2. onstat -g ntd
---------------这个没有看到数据。

我当时onstat -a出来了(因为onstat -a数据比较多,我就不全部贴出来了)。
还有哪些信息有用的?收起
IT分销/经销 · 2010-07-22
浏览352
yunzhongyueyunzhongyue数据库运维工程师GBase
数据库日志里有显示不?显示全部
数据库日志里有显示不?收起
互联网服务 · 2010-07-22
浏览369
liaosnetliaosnet信息分析/架构师gbasedbt.com
onstat -g ntd 看看有多少 拒绝的情况...onstat -u 可以显示有多少连接~你这的NETTYPE在默认情况下是50个连接~显示全部
onstat -g ntd 看看有多少 拒绝的情况...
onstat -u 可以显示有多少连接~

你这的NETTYPE在默认情况下是50个连接~收起
IT咨询服务 · 2010-07-22
浏览360

提问者

little_stone
CIO武汉高科技公司

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2010-07-22
  • 关注会员:0 人
  • 问题浏览:18505
  • 最近回答:2010-11-04
  • X社区推广