【发布时间】:2011-01-15 04:37:38
【问题描述】:
有没有办法在 .NET 应用程序中确定我当前是否受到 CPU 时间的限制,或者 IO 是否是瓶颈?
我正在查询一堆远程网络服务,其中的细节并不重要,可以抽象为:
// perform a single operation
if ( [randomness] ) {
sleep(10s of seconds); // DNS/TCP connection timeout
} else {
sleep(10s of miliseconds); // query a remote server
}
for x = 1…lots {
// Do some CPU intensive work
}
虽然我有可用的 CPU,但我希望尽可能多地安排这些线程,因为它们会花费很长时间等待 IO,但是一旦 CPU 完全加载,我不想继续生成线程,因为那样会导致性能崩溃。任务总数为“大”。
一个明显的答案是只选择一个“合理”数量的并发线程作为调整参数,但这会遇到两个问题:
- “睡眠”的长度在 LAN 往返和 TCP 连接超时之间可能会有很大差异,因此 CPU 工作与 IO 等待时间的比率可能相差 3 个数量级。
- 将在其上运行的机器的大小可以在小型单 CPU 虚拟机和重型服务器级机器之间变化。
在理想情况下,IO 操作将全部替换为异步完成回调,但在这种情况下这并不容易/不可能,因为网络 RPC 正在使用现有的阻塞代码。
【问题讨论】:
-
您是否考虑过使用 IO 完成端口?它们与线程本身无关,因此一个线程可以注册这些负载而不会用许多线程污染系统:codeproject.com/KB/cs/managediocp.aspx
标签: c# .net multithreading