2012-02-17 62 views
1

我正在做一个相当大的应用程序,负责做实时运动跟踪和摄像机移动控制。其任务是:冻结管理线程

  • 运动跟踪
  • (由本机模块,它从一个网络摄像头解码的视频流,并提供大如1280×720像素,并跟踪结果通过回调托管的应用程序都像缓冲区完成)
  • 从接收定位反馈数据和运动数据发送给平移/倾斜硬件约20倍的第二以及缩放命令从/到摄像机
  • 显示的图像数据包括实时可视化
  • 编码和写入的图像和会话数据
  • 视频的自动后处理由另一个进程完成

该应用程序使用.NET 4.0并具有WPF用户界面。

托管线程冻结

从我们不得不面对管理线程冻结500之间,以1500毫秒,这是非常多的这样的实时应用程序的开始。

为了找出这些挂起发生的时间,我创建了一个线程,其唯一的任务是始终进行100ms的睡眠。然后,我计算了睡眠真正花费了多长时间,并确定了相机移动停止的时间。它的工作非常可靠,线程都在同一时间!

非托管线程不冻结

虽然所有托管线程冻结非托管线程没有任何问题的工作。我们通过独立于应用程序的托管部分编写的日志来检查该日志。

分析

我试图找出与现象也许可以导致此行为:

  • 整机减慢,当我们遇到这些问题:Windows正在响应速度很慢(如目录列表在Windows资源管理器和我的应用程序中挂起半分钟,或者启动应用程序需要非常长的时间)
  • 我们同时读取和写入数千个文件(跟踪和后处理应用程序),可能是(根据Process.VirtualMemory64)此不多要价窗口
  • GUI的响应变得非常慢
  • 该应用程序使用有关虚拟内存的1.3GB /工作集存储器(Process.WorkingSet64)的500MB - 会不会是一些交换到硬盘上?
  • 当然,如果我们杀了这个进程在Windows再次响应速度快(那怎么可以检查或解决了吗?),但它需要的Windows一会儿就如何进行调查这个

提示重新正常响应将不胜感激。非常感谢你!

+0

您描述的内容听起来像颠簸:http://en.wikipedia.org/wiki/Thrashing_%28computer_science%29尝试使用FileMon和DiskMon来查看实际发生的磁盘访问情况。 – Candide 2012-02-17 11:14:20

+0

运行taskmgr.exe,进程选项卡。查看+选择列并勾选“页面错误增量”。通常的下一个结论是“啊,需要更多的RAM”。 – 2012-02-17 13:53:00

+0

@HansPassant:我在“Page fault delta”下得到的值高达70.000。这是否意味着“颠簸”? (顺便说一下:你可以创建一个新的回答这篇文章,而不是评论) – nepa 2012-02-24 16:23:09

回答

1

我会建议采取流程转储,因为你遇到的性能问题。您可以通过多种方式执行此操作(SysInternals中的taskmgr.exe或procdump.exe)。采取完整的内存转储。

一旦你有.dmp文件,你可以用windbg(或Visual Studio 2010)分析它。对于托管进程,您需要加载sos.dll扩展。

有很多很好的资源的WinDbg在那里,但这里有一些是曾经帮助过我:

1)苔丝费尔南德斯video(ASP.NET进程,但技术是相同的)

2)WinDbg cheatsheet

当您遇到问题并告诉您确切的罪魁祸首时,内存分析将能够为您提供堆栈(!clrstack)。