IT分销/经销数据库Informix

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

在调用informix的api后,调用堆栈如下,但就是不返回。导致调用阻塞。函数堆栈如下:WS2_32!WSARecv+0x65   WSOCK32!recv+0x31   isqlt09a!service1+0xd932   isqlt09a!service1+0xcaae   isqlt09a!ifx_int8cmp+0xe441   i...显示全部
在调用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

查看其它 39 个回答jillme的回答

jillmejillme课题专家组CIO某大型银行
to 楼主:i
nformix的缓冲区占用了驻留内存中最大的部分。定义缓冲区的参数是BUFFERS。称作指定共享内存缓冲区的最大数目,该参数对数据库I/O和事务处理吞吐量有明显的影响。但是,如果分配过多的缓冲区会影响到操作系统的内存并导致过多的交换内存页面的活动。一般建议设置为物理内存的20%到25%。按照通常的说法

SHMVIRTSIZE定义了分配给Informix IDS共享内存的虚拟存储区的大小。一般考虑能满足一个日常操作的需要。
STACKSIZE指示了数据库服务器为每个活动线程指派的初始堆栈的大小。如果将该参数配置得过小,那么线程将无法拥有执行其程序的足够内存空间,而且它将干扰其他线程。
SHMADD定义了Informix IDS自动加到虚拟存储区的共享内存增量的大小。在增加共享内存时,要占用CPU周期;每次的增加量越大,增加次数就越少,留给其它的进程的内存也越少。所以一般采用大的增加量。但是在内存负荷很重时,少量增加使其他程序更好的共享内存资源。
所以是不是最好看下onconfig文件中的SHMVIRTSIZE,STACKSIZE,SHMADD参数。



命令 onstat -p是监控内存的另一个命令。其输出结果中的两个%cache显示了读写高速缓存比例的百分比,一般在80%到90%之间,如果低于80%,要调节BUFFERS参数值。ovlock 字段表明 IDS 在使用了最大数量的锁之后尝试过再使用锁的次数,如果该数字非零,可能需要提高配置文件中 LOCKS 参数的值。ovbuf 字段表明 IDS 在使用了最大数量的缓冲区之后尝试过再使用缓冲区的次数。如果该数字很大,比如说超过 100000,就需要提高 BUFFERS 参数,以便用户在需要从磁盘访问数据时不必等待缓冲区。在监控内存的使用情况时还可以采用Unix系统命令vmstat。

要是这些也不行的话,真的就不是很清楚了。
互联网服务 · 2010-11-04
浏览1158

回答者

jillme
CIO某大型银行

jillme 最近回答过的问题

回答状态

  • 发布时间:2010-11-04
  • 关注会员:0 人
  • 回答浏览:1158
  • X社区推广