我正在做一个相当大的应用程序,负责做实时运动跟踪和摄像机移动控制。其任务是:冻结管理线程
- 运动跟踪 (由本机模块,它从一个网络摄像头解码的视频流,并提供大如1280×720像素,并跟踪结果通过回调托管的应用程序都像缓冲区完成)
- 从接收定位反馈数据和运动数据发送给平移/倾斜硬件约20倍的第二以及缩放命令从/到摄像机
- 显示的图像数据包括实时可视化
- 编码和写入的图像和会话数据
- 视频的自动后处理由另一个进程完成
该应用程序使用.NET 4.0并具有WPF用户界面。
托管线程冻结
从我们不得不面对管理线程冻结500之间,以1500毫秒,这是非常多的这样的实时应用程序的开始。
为了找出这些挂起发生的时间,我创建了一个线程,其唯一的任务是始终进行100ms的睡眠。然后,我计算了睡眠真正花费了多长时间,并确定了相机移动停止的时间。它的工作非常可靠,线程都在同一时间!
非托管线程不冻结
虽然所有托管线程冻结非托管线程没有任何问题的工作。我们通过独立于应用程序的托管部分编写的日志来检查该日志。
分析
我试图找出与现象也许可以导致此行为:
- 整机减慢,当我们遇到这些问题:Windows正在响应速度很慢(如目录列表在Windows资源管理器和我的应用程序中挂起半分钟,或者启动应用程序需要非常长的时间)
- 我们同时读取和写入数千个文件(跟踪和后处理应用程序),可能是(根据Process.VirtualMemory64)此不多要价窗口
- GUI的响应变得非常慢
- 该应用程序使用有关虚拟内存的1.3GB /工作集存储器(Process.WorkingSet64)的500MB - 会不会是一些交换到硬盘上?
- 当然,如果我们杀了这个进程在Windows再次响应速度快(那怎么可以检查或解决了吗?),但它需要的Windows一会儿就如何进行调查这个
提示重新正常响应将不胜感激。非常感谢你!
您描述的内容听起来像颠簸:http://en.wikipedia.org/wiki/Thrashing_%28computer_science%29尝试使用FileMon和DiskMon来查看实际发生的磁盘访问情况。 – Candide 2012-02-17 11:14:20
运行taskmgr.exe,进程选项卡。查看+选择列并勾选“页面错误增量”。通常的下一个结论是“啊,需要更多的RAM”。 – 2012-02-17 13:53:00
@HansPassant:我在“Page fault delta”下得到的值高达70.000。这是否意味着“颠簸”? (顺便说一下:你可以创建一个新的回答这篇文章,而不是评论) – nepa 2012-02-24 16:23:09