你认为什么是CPU密集型任务.例如......算法/代码(不是像视频编辑那样的用例等).原因似乎是不使用NodeJS的主要原因我真正喜欢的主要是CPU密集型任务.重要的是什么呢?例如,它是排序,搜索,横向图形,矩阵乘法吗?
我想使用/ proc每秒查找特定进程的资源使用情况.资源包括cputime,磁盘使用情况和网络使用情况.我查看/ proc/pid/stat,但我不确定我是否收到了所需的详细信息.我想要所有3个资源使用,我想每秒监视它们.
在剖析本土网络应用程序时,我遇到了非常奇怪的(至少对我来说)观察.
几乎所有的时间都花在socketRead0()了SocketInputStream课堂的方法上.这并不奇怪,因为我的应用程序在每个请求上都使用远程服务进行联网.奇怪的是,这种方法不仅挂钟时间使用率高,而且CPU时钟时间也很高.我无法理解为什么CPU时间很长,因为如果我的应用程序等待远程服务回复(实际上并不是那么快),那么应用程序本身就没有什么可做的了.所以CPU时间应该很低.
更多观察:
SocketInputStream.socketRead0()占用时间高达95%(挂钟时间和 CPU时间);mpstat (我们使用Linux作为操作系统)显示约90%的用户时间和约1-3%的系统时间(其余为空闲时间);RestTemplate来与远程服务进行交互,而不是SocketInputStream直接进行.现在我只有一个想法 - 也许这是在JVM中调用本机方法的开销(SocketInputStream.socketRead0()原生)?
你怎么看?还有其他原因吗?
我刚刚将我的IntelliJ IDEA更新到最新的12.1版本,我发现我的笔记本CPU使用率不时变为100%,监控进度管理器我发现IDEA定期分叉一个新的Java进程并运行几十秒并关闭.在此期间,CPU使用率接近100%:
您是否找到了这样的工具并成功使用了它?
如何获取C#中的所有进程列表,然后获取每个进程当前内存和CPU消耗?
示例代码非常感谢.
我想在特定点获得CPU周期.我在这一点上使用这个功能:
static __inline__ unsigned long long rdtsc(void)
{
unsigned long long int x;
__asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
return x;
}
Run Code Online (Sandbox Code Playgroud)
问题是它总是返回一个增加的数字(在每次运行中).就好像它指的是绝对时间.
我错误地使用了这些功能吗?
背景:
在我用C++编写的应用程序中,我创建了3个线程:
std::queue1.前两个线程占CPU使用率的60-80%,平均每个占35%.
题:
我不明白为什么有些线程占用高CPU.
我将其分析如下:如果操作系统做出决策,如上下文切换,中断和调度,哪个线程应该被授予对系统资源的访问权限,比如CPU时间,那么进程中的某些线程是如何发生的呢?比其他人使用更多的CPU?看起来有些线程在枪口强行从操作系统中获取CPU ,或者操作系统对某些线程有一个真正的软点,所以它从一开始就偏向于它们,为它们提供了所有的资源.为什么它不能公正,并平等地给予他们所有人?
我知道这很天真.但是,如果我按照这一思路思考,我会更加困惑:操作系统根据线程要完成的工作量来访问线程的CPU,但操作系统在执行之前如何计算或预测工作量彻底?
我想知道高CPU使用率的原因是什么?我们如何识别它们?是否可以通过查看代码来识别它们?有什么工具?
我正在使用Visual Studio 2010.
我也怀疑std::queue.我知道标准容器不是线程安全的.但是如果只有一个线程将项目排队到队列中,那么如果只有一个线程从中取消项目是否安全呢?我想它就像一个管道,一方面你插入数据,另一方面,你删除数据,那么为什么它是不安全的,如果它同时完成?但是,这不是本主题中的真正问题,但是,您可以在答案中添加注释,解决此问题.
更新:
在我意识到我的消费者线程正在使用busy-spin之后,我已经使用Sleep修复了3秒钟.这个修复是暂时的,很快我就会使用Event.但即使使用Sleep,CPU的使用率也降至30-40%,有时它会达到50%,从可用性的角度来看似乎并不理想,因为系统不响应其他应用程序用户当前正在使用的.
有什么方法我仍然可以改善高CPU使用率?如前所述,生产者线程(现在使用大多数CPU周期)读取文件,解析其中的数据包(某些格式),并从中生成模式.如果我使用睡眠,那么CPU使用率会降低,但这是个好主意吗?解决它的常用方法有哪些?
我在具有四核CPU的机器上运行Ubuntu.我编写了一些测试Java代码,它产生了一定数量的进程,这些进程只是在运行时为一定数量的迭代增加一个volatile变量.
我希望运行时间不会显着增加,而线程数小于或等于内核数量,即4.实际上,这些是我从UNIX time命令使用"实时"的时间:
1个线程:1.005s
2个主题:1.018s
3个主题:1.528s
4个主题:1.982s
5个主题:2.479s
6个主题:2.934s
7个主题:3.356s
8个主题:3.793s
这表明添加一个额外的线程不会像预期的那样增加时间,但随后时间会增加3和4个线程.
起初我以为这可能是因为操作系统阻止了JVM使用所有内核,但我跑了top,它清楚地表明,有3个线程,3个内核运行在~100%,有4个线程,4个内核是超出.
我的问题是:为什么在3/4 CPU上运行的代码与在1/2运行时的速度大致相同?因为它是在所有核心并行运行.
这是我的主要参考方法:
class Example implements Runnable {
// using this so the compiler does not optimise the computation away
volatile int temp;
void delay(int arg) {
for (int i = 0; i < arg; i++) {
for (int j = 0; j < 1000000; j++) {
this.temp += i + j;
}
}
}
int arg;
int result;
Example(int …Run Code Online (Sandbox Code Playgroud) cpu-usage ×10
java ×3
linux ×3
performance ×2
.net ×1
actionscript ×1
assembly ×1
c# ×1
c++ ×1
concurrency ×1
cpu ×1
flash ×1
javascript ×1
jvm ×1
multicore ×1
node.js ×1
procfs ×1
profiling ×1
resources ×1
x86 ×1