【问题标题】:Multiple app instances, windows GDI limit多个应用实例,windows GDI 限制
【发布时间】:2011-06-26 13:30:33
【问题描述】:

我试图同时运行同一个应用程序的数百个实例(使用 C#),并且在大约 200 个实例之后,GUI 开始显着减慢,直到下一个实例的加载时间攀升至 20 秒(从1 秒)。

测试加工是: 至强 5520 12GB 内存 windows 2008 网络 64 位

在最大负载(200 个实例)下,cpu 大约为 20%,ram 为 45%,所以我确定这不是硬件问题。

我已经尝试在 windows 的注册表中配置 Session 大小和 SharedSection,但似乎没有帮助。

我还尝试在后台以及多个会话(不同的会话)上运行该应用程序,但仍然相同(尽管可能是每个会话的限制)。

当例如在一个会话上发生减速时,我可以登录到另一个会话并且桌面可以正常工作(第一个桌面变得无法使用。)

我的问题是 - 有没有办法去除 gdi 对象或消除 GUI 的使用?还是 Windows 限制?

p.s - 因为它是第三方应用,所以我无法更改它。

提前致谢。

【问题讨论】:

    标签: c# gdi


    【解决方案1】:

    在运行 200 个实例的情况下,不断的上下文切换可能会损害性能。上下文切换不计入 CPU 负载。

    编辑:哎呀,错误的链接。

    尝试监视系统上的上下文切换 http://technet.microsoft.com/en-us/library/cc938606.aspx

    【讨论】:

    【解决方案2】:

    我怀疑它是 GDI - 如果您用完 GDI 句柄/资源,您会注意到大量窗口无法重绘,而不是一切都变慢了。

    性能突然下降的最可能原因是,当所有进程都在争夺 CPU 时间时,您正在最大限度地使用 RAM 并破坏您的虚拟内存。检查内存使用情况,如果它很高,请查看是否可以减少应用程序的占用空间。或者通过安装更多 RAM 来应用“硬件修复”。或者在可能的情况下将 Sleeps 添加到您的应用中,这样它们就不会要求您的 CPU 提供恒定的时间片(因此需要不断地从 VM 中调入)。

    【讨论】:

    • 嗨 Jason,在调整注册表之前,我确实遇到了您描述的问题。关于内存——我之前确实提到过,在减速时内存使用率约为 45%,而 cpu 只有 20%,所以我很确定这不是物理硬件问题。感谢您的快速回复。其他想法?
    • 应用程序可能会做任何不可扩展的事情吗?如果它不希望有 200 个实例在运行,那么它很可能正在做一些干扰自己的事情。可能有各种各样的事情不能很好地扩展,原始作者从未想过会同时运行 200 个实例的场景(例如争用文件等共享资源、向整个实例组广播消息、共享内存等)。
    • 最终,如果您不“拥有”正在执行的应用程序,您可能无能为力。但是,您可以进行一些小的调整(例如,您可以通过在屏幕外打开所有应用程序来减少 GDI 资源使用,但前提是应用程序编写得足够好以避免在需要它们之前使用资源)。您可以尝试一个进程监视器,看看您是否可以发现任何关于正在发生的事情的提示(例如,硬盘使用情况是什么 - 它也是 45%,还是已达到最大值?存在瓶颈,所以如果不是 RAM 或 CPU ,可能是 I/O - 也许将关键资源放在 RAMdisk 上可能会有所帮助)
    • 关于 IO - 它已经从 ram 磁盘运行(但我喜欢你的想法:))并且几乎没有 IO。我也尝试在后台运行应用程序,但仍然得到相同的结果。然而,我确实按照尼克的建议检查了上下文切换,但我不确定这意味着什么,也许你可以告诉我 - 这是在服务器满负荷时截取的截图 2shared.com/photo/5FE2sbCu/server-load.html
    • 抱歉,我还没有研究过这方面的上下文切换,所以在这个方向上不能给你任何坚定的指导。 (但我会认为,除非应用程序正在做一些相当反社会的事情(比如在繁忙的等待循环中强制上下文切换),否则仅仅 200 个进程不应该让操作系统承受任何巨大的压力)。如果您可以发布更多信息(例如,关于应用程序正在做什么),也许有人可以为您提供更多线索。
    猜你喜欢
    • 2010-11-15
    • 1970-01-01
    • 2011-09-02
    • 2014-02-11
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 2018-11-07
    • 1970-01-01
    相关资源
    最近更新 更多