IOCP调用WSASend引发Handle增长

xian_wwq 2014-03-03 05:12:50
Server采用IOCP,在高并发压力下,观察到Handle一直在增长。
使用Windbg的Htrace进行跟踪,发现增长点在:
--------------------------------------
Handle = 0x00000f80 - OPEN
Thread ID = 0x00000d10, Process ID = 0x00001da8

0x773e469c: ntdll!ZwCreateEvent+0x0000000c
0x74de2420: mswsock!MSAFD_SockThreadInitialize+0x0000001b
0x74de24a1: mswsock!SockEnterApiSlow+0x0000003c
0x74de4b77: mswsock!WSPSend+0x00000085
0x76ec6920: WS2_32!WSASend+0x0000007b
0x7307acc1: rython_kernel!CIOCPServer::IOCPWritePost+0x00000091

---------------------------------------
Handle = 0x00000f7c - OPEN
Thread ID = 0x00000d10, Process ID = 0x00001da8

0x773e498c: ntdll!NtDuplicateObject+0x0000000c
0x755c77ed: KERNELBASE!DuplicateHandle+0x00000069
0x77540662: kernel32!DuplicateHandleImplementation+0x000000b3
0x76ec35ae: WS2_32!WahOpenCurrentThread+0x00000047
0x76ec3558: WS2_32!DTHREAD::Initialize+0x0000002d
0x76ec34ca: WS2_32!DTHREAD::CreateDThreadForCurrentThread+0x0000003c
0x76ec35de: WS2_32!Prolog_v2+0x00000035
0x76ec3385: WS2_32!SlowPrologOvlp+0x00000012
0x76ec4aa2: WS2_32!WSASend+0x0000003f
--------------------------------------

不知道什么原因导致的?请大牛指点。
...全文
294 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
mike07026 2014-12-07
  • 打赏
  • 举报
回复
我在windows下使用asio也遇到句柄增长的情况,每个连接用对象管理socket和收发内存buf,使用了连接对象池。发现handle增长跟连接数峰值有关。具体来说,假如第一次峰值2w连接,handle增长到某一数值k,如果以后的峰值都不超过2w,handle不会继续增长下去,保持k。怀疑这是系统行为。
xian_wwq 2014-03-10
  • 打赏
  • 举报
回复
经过试验,似乎在debug模式下会出现的handle增长,在release模式下增长不大。具体原因不明。
xian_wwq 2014-03-05
  • 打赏
  • 举报
回复
引用 5 楼 my3439955 的回复:
[quote=引用 3 楼 xian_wwq 的回复:] [quote=引用 1 楼 my3439955 的回复:] WSASend本身不会引发句柄增长,可能是封装库的问题。
那除了用windbg的htrace方式,还有什么好的定位handle增长的方法,请赐教[/quote] 如果是具名的对象,那么用procexp查看一下句柄名字就知道了 [/quote] 问题是用Procexp看到的增长handle类型是 Unnamed。
xian_wwq 2014-03-05
  • 打赏
  • 举报
回复
引用 7 楼 baodi_z 的回复:
楼主可以看看你的服务器程序中有没有哪些地方创建句柄,但是没有close
小压力下我们使用DevPartner 试用版跟过代码,没有发现句柄泄露。 还有什么需要注意的?请指教
zdleek 2014-03-05
  • 打赏
  • 举报
回复
楼主可以看看你的服务器程序中有没有哪些地方创建句柄,但是没有close
xian_wwq 2014-03-04
  • 打赏
  • 举报
回复
引用 2 楼 VisualEleven 的回复:
锁定了太多非分页内存??
我说明下测试场景。 服务运行后,承接压力大,handle涨的快,降压力,hanle会涨的慢。 使用ProcessExplorer可以看到服务中的Unnamed Handle一直在增长。 所以才使用windbg的htrace来跟踪。 看了下系统内存情况,“非页面缓冲池”大概10,440K。 谢谢。
xian_wwq 2014-03-04
  • 打赏
  • 举报
回复
引用 1 楼 my3439955 的回复:
WSASend本身不会引发句柄增长,可能是封装库的问题。
那除了用windbg的htrace方式,还有什么好的定位handle增长的方法,请赐教
  • 打赏
  • 举报
回复
引用 3 楼 xian_wwq 的回复:
[quote=引用 1 楼 my3439955 的回复:] WSASend本身不会引发句柄增长,可能是封装库的问题。
那除了用windbg的htrace方式,还有什么好的定位handle增长的方法,请赐教[/quote] 如果是具名的对象,那么用procexp查看一下句柄名字就知道了
Eleven 2014-03-03
  • 打赏
  • 举报
回复
锁定了太多非分页内存??
  • 打赏
  • 举报
回复
WSASend本身不会引发句柄增长,可能是封装库的问题。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧