【问题标题】:How many Windows handles in use is "too many"?使用的 Windows 句柄有多少是“太多”?
【发布时间】:2010-10-31 09:17:25
【问题描述】:

我了解此问题的答案可能取决于注册表设置和 Windows 版本,如果内存不足,可能还取决于 RAM 量。为了这个问题,假设服务器有足够的 RAM (3+ GiB)。

如果一个应用程序(在这种情况下是第三方应用程序)每小时泄漏几百个句柄,那么在其他应用程序遇到问题之前,该应用程序可以泄漏多少个句柄?我所说的“麻烦”是指,例如,无法启动线程、无法打开文件等等。

我已经看到一些服务器(轻负载)在使用数万个句柄的进程(通常是数据库进程)上运行良好,因此旧的 10000 个句柄限制显然不是这里的问题。 (无论如何,这是一个每个进程的限制,所以不会影响我的应用程序,它远远低于这一点。)

有人可以回答这个问题或向我指出一些资源,这些资源可以解释在您有效用完(句柄或其他系统资源)之前,Windows 服务器将允许多少总句柄?

【问题讨论】:

  • 这似乎更像是 ServerFault 类型的问题。
  • @Matthew Vines:我考虑过这一点,但由于我使用我维护的一个程序遇到了这个问题,即使第 3 方应用程序泄露了句柄,我还是决定它属于程序员网站。如果我是一名试图解决这个问题的管理员,SF 会更合适。
  • This blog post from 2011 有一些很好的经验建议,关于哪些过程不需要担心。例如。 lsass.exe 最多 30,000(32 位)或 50,000(64 位)即可。
  • 我的任务管理器目前显示 16,835,261 个句柄(Win10,正常运行时间 7 天),因此 16*1024*1024 或 16,777,216 的限制似乎不正确。

标签: windows performance handle


【解决方案1】:

根据this,10000。

【讨论】:

  • 这些只是窗口对象句柄,不会影响其他类型的句柄(文件、事件、互斥体等)
【解决方案2】:

Raymond Chen's post on this topic。窗口管理器强制每个进程限制为 10K,并且整个系统的总限制为 32K。因此,如果它每小时“仅”泄漏 100 个句柄,那么在它开始出现异常之前,您有几天的正常运行时间。

请注意,并非所有句柄都是平等的。例如,窗口句柄不是数据库句柄,并且可能遵循不同的规则。因此,此限制可能不适用,具体取决于程序泄漏的句柄类型。 Also read this blog post.

【讨论】:

  • article 中,它声称每个进程最多可以处理 1600 万个句柄。我还注意到在 windows xp 中我的两个进程超过了 10k 限制。我很困惑。
  • 我猜这个限制同时改变了,也看看Thomas Weller的回答。
【解决方案3】:

desktop heap,这是一个内存池,句柄代表生命的真正“东西”。 有时不是你分配了多少句柄,而是该句柄下的每个对象使用了多少内存。你可以调试堆this way。要安装的是pain

(这是从我的另一个答案中回收的)

【讨论】:

  • 调试工具不再适用于 Windows 7,我稍后假设。
【解决方案4】:

由于这些值可能会随着新的 Windows 版本而改变,因此您可以使用 SysInternals 工具 TestLimit / TestLimit64 进行粗略估计。 x64版本可能会运行一段时间,尤其是内存测试(它可能会使用硬盘(交换文件)来获得更多的虚拟内存)。

http://live.sysinternals.com/WindowsInternals/http://download.sysinternals.com/files/TestLimit.zip 获取工具

命令行选项:

-p check process limit
-t check thread limit
-h check handle limit
-u check user handle limit

【讨论】:

    【解决方案5】:

    根据this recent blog post,Windows 10 中进程的总句柄限制硬编码为16*1024*102416,777,216

    由于Windows Executive (see also here) 还存储一些有关句柄的跟踪信息,实际限制为 16,711,680(对于 64 位 Windows 10)和 16,744,448(对于 32 - 位 Windows 10:

    Executive 在页面大小的块中按需分配句柄表,并将其划分为句柄表条目。这意味着在 x86 和 x64 上都是 4096 字节的页面可以在 32 位 Windows 上存储 512 个条目,在 64 位 Windows 上可以存储 256 个条目。执行程序通过将硬编码的最大值 16,777,216 除以页面中的句柄条目数来确定分配给句柄条目的最大页数,结果在 32 位 Windows 上为 32,768,在 64 位 Windows 上为 65,536 .因为Executive 使用每个页面的第一个条目作为自己的跟踪信息,所以进程可用的句柄数实际上是16,777,216 减去这些数字,这解释了Testlimit 获得的结果:16,777,216-65,536 是16,711,680 和16,777,216-65,536-32,768是 16,744,448。

    【讨论】:

    • 注意1024是32位的windows,实际上是32*1024*512。在 64 位上,它实际上是 128 个指针 * 每页 8 个字节的 512 个指针 * 每页 16 个字节的 256 个条目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    相关资源
    最近更新 更多