我正在进行一些吞吐量测试.我的申请必须
我的目标是模拟#2,"一些处理".也就是说,在转发事件之前引入延迟并占用CPU一段给定时间(例如500ms).
天真的方法是Thread.sleep(500).这会在执行中引入正确的延迟,但不会运行CPU.
计算斐波纳契数是一种选择. 有没有人使用任何有趣的技术只是为了让CPU在一段时间内保持忙碌状态?
理想的特征是:
作为一个主要处理高级编程语言的软件开发人员,我不确定我能做些什么来适当地关注即将到来的多核计算机的全方位存在.我写的主要是普通和非要求的应用程序,但我认为重要的是要知道我是否需要改变任何编程范例甚至语言来掌握未来.
我的问题是:
How to deal with increasing multicore presence in day-by-day hacking?
有没有人知道一个工具,可以帮助我弄清楚为什么我们在托管应用程序中看到失控的CPU?
我不想要的:
进程资源管理器,它有这个很棒的功能,可以让你看到每个线程的CPU,但你没有得到托管堆栈跟踪.此外,它需要一个相当熟练的用户.
Windbg + SOS,它可能用于通过抓取一堆转储来弄清楚发生了什么.但是,对于自动化而言,这是非常重要的.
完全成熟的分析器(如dottrace或redgate),许可是复杂的,并且该工具是一种过度杀伤,需要相当大的安装.
我在找什么:
从技术上讲,我知道可以创建这样的工具(使用ICorDebug),但如果已经存在这样的工具,则不想随时投资.
那么,有谁知道这样的事情?
在我的应用程序中,我在NSOperationQueue中执行10个异步NSURLConnections作为NSInvocationOperations.为了防止每个操作在连接有机会完成之前返回,我调用CFRunLoopRun(),如下所示:
- (void)connectInBackground:(NSURLRequest*)URLRequest {
TTURLConnection* connection = [[TTURLConnection alloc] initWithRequest:URLRequest delegate:self];
// Prevent the thread from exiting while the asynchronous connection completes the work. Delegate methods will
// continue the run loop when the connection is finished.
CFRunLoopRun();
[connection release];
}
Run Code Online (Sandbox Code Playgroud)
连接完成后,最终连接委托选择器调用CFRunLoopStop(CFRunLoopGetCurrent())以恢复connectInBackground()中的执行,允许它正常返回:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
TTURLConnection* ttConnection = (TTURLConnection*)connection;
...
// Resume execution where CFRunLoopRun() was called.
CFRunLoopStop(CFRunLoopGetCurrent());
}
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
TTURLConnection* ttConnection = (TTURLConnection*)connection;
...
// Resume execution where CFRunLoopRun() was called.
CFRunLoopStop(CFRunLoopGetCurrent());
} …Run Code Online (Sandbox Code Playgroud) 我知道现代CPU可以无序执行,但是他们总是按顺序退出结果,如维基百科所述.
"Out of Oder处理器及时填写这些"插槽"并准备好其他指令,然后在结尾处重新排序结果,使其看起来正常处理指令. "
现在,当使用多核平台时,据说需要内存防护,因为由于乱序执行,可以在此处打印错误的x值.
Processor #1:
while f == 0
;
print x; // x might not be 42 here
Processor #2:
x = 42;
// Memory fence required here
f = 1
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,由于乱序处理器(我假设MultiCore处理器的情况下的核心)总是按顺序退出结果,那么内存栅栏的必要性是什么.难道多核处理器的核心不会看到仅从其他核心退役的结果,或者它们是否也会看到正在进行中的结果?
我的意思是在我上面给出的例子中,当处理器2最终退出结果时,x的结果应该在f之前,对吗?我知道在乱序执行期间它可能在x之前修改了f,但它必须在x之前没有退役,对吗?
现在有了按顺序退出结果和缓存一致性机制,为什么你需要在x86中使用内存栅栏?
我正在使用JProfiler来分析我的应用程序,因此,在"CPU视图"部分中,它表明花费了超过40%的CPU时间Object.wait().但据我所知,在Object.wait()CPU上没有给予等待线程.
有人可以帮助了解发生了什么以及为什么分析器显示这么多的CPU花费了Object.wait()吗?
下面是我的服务器htop显示.该nginx过程使用CPU时间超过18小时,并以红色显示,但CPU和内存都看起来不错.该值是否在正常范围内?

PRE-SCRIPTUM:
我搜索过StackOverflow并且没有Q/A解释调整WebRTC的所有可能性,以使其更适合最终产品.
问题:
WebRTC有一个非常好的用户体验,它正在削减优势.它应该是完美的网状电话(3-8人),但它还没有.网格调用的最大问题(所有参与者彼此交换流)是资源消耗,尤其是CPU.
以下是我想分享的一些统计数据:
2.3 GHz Intel Core i5(2核),OSX 10.10.2(14C109),4GB RAM,Chrome 40.0.2214.111(64位)
+------------------------------------+----------+----------+
| Condition | CPU | Delta |
+------------------------------------+----------+----------+
| Chrome (idle after getUserMedia) | 11% | 11% |
| Chrome-Chrome | 55% | 44% |
| Chrome-Chrome-Chrome | 74% | 19% |
| Chrome-Chrome-Chrome-Chrome | 102% | 28% |
+------------------------------------+----------+----------+
Run Code Online (Sandbox Code Playgroud)
题:
我想创建一个WebRTC调整表,它可以改善资源消耗并提高整体体验.除了下表中的那些设置之外,我还可以使用其他任何设置吗?
+------------------------------------+--------------+----------------------+
| Tweak | CPU Effect | Affects |
+------------------------------------+--------------+----------------------+
| Lower FPS | Low to high | Video quality lower |
| Lower …Run Code Online (Sandbox Code Playgroud) 我有/ cgroup/cpuset/set1.set1有2-5,8.我想将一个进程绑定到该cpuset,然后将该进程中的一个线程固定到核心4.Cpuset的名称和线程名称以及我应该绑定线程的核心位于m配置文件中.是否有任何C API来解析cpuset?使用C代码实现固定的正确方法是什么?