我正在开发一个通过HTTP传输音乐的Java应用程序,我遇到的一个问题是,当应用程序从磁盘读取音频文件并将其发送到客户端时,它通常会将CPU最大化为90-100 %(可能导致用户运行其他应用程序时出现问题).
是否可以控制执行此工作的线程使用较少的CPU,还是需要由OS控制?是否有任何技术可以管理您目前的应用程序密集程度?
我知道你可以启动具有高/低优先级的线程,但在这种情况下,这似乎对我没有任何影响.
(我无法理解"我已经要求计算机做某事,所以它显然会尽可能快地完成它......")
谢谢!
竿.
我注意到一个叫做nanosleep的小测试程序在使用比2.6.22更新的内核的Linux机器上运行时显示出CPU使用率的巨大差异.
#include <time.h>
int main (void)
{
struct timespec sleepTime;
struct timespec returnTime;
sleepTime.tv_sec = 0;
sleepTime.tv_nsec = 1000;
while (1)
{
nanosleep(&sleepTime, &returnTime);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
(是的,我意识到这个程序什么都不做)
如果我编译它并在openSUSE 10.3机器上运行它(2.6.22.19-0.2-default),程序甚至不显示在"top"生成的进程列表上,向我表明它使用的CPU时间非常少.如果我在openSUSE 11.1机器上运行它(2.6.27.23-0.1-default),top会显示该程序占用40%的CPU时间.在Fedora 9(2.6.25-14.fc9.i686)和Fedora 10上运行也显示了"top"中相同的高CPU使用率.
内核是否有变化影响了这个?
最初发布在Server Fault上,有人建议在这里提出这个问题.
我们使用JBoss来运行两个WAR.一个是我们的网络应用程序,另一个是我们的Web服务.Web应用程序访问另一台计算机上的数据库并向Web服务发出请求.Web服务向其他计算机发出JMS请求,聚合数据并返回它.
在我们最大的客户端,大约每月一次,JBoss Java进程占用了所有CPU的100%.运行JBoss的机器有8个CPU.我们的网络应用程序在此期间仍可访问,但页面加载大约需要3分钟.重启JBoss会恢复正常.
数据库机器和所有其他机器都很好,只有运行JBoss的机器受到影响.内存使用情况正常.网络利用率是正常的.JBoss日志中没有可疑的错误消息.
我已经建立了一个尽可能接近客户端生产环境的测试环境,并且我已经完成了高达2倍并发用户数的负载测试.我没有得到我的测试环境来复制问题.
我们从哪里去?我们怎样才能缩小问题?
目前我们唯一的计划是等到生产中出现问题,然后进行一些调试以确定原因.到目前为止,人们刚刚在问题发生时重新启动了JBoss,以尽量减少停机时间.下次它发生时,他们会让开发人员看一看.问题是,下次发生时,可以采取哪些措施来确定原因?
我们可以在同一个盒子上设置一个单独的JBoss实例,并与Web服务分开安装Web应用程序.这样,当下一个问题发生时,我们将知道哪个WAR有问题(假设它是我们的代码).尽管如此,这并没有缩小范围.
我应该启用JMX遥控器吗?这种方式下次出现问题时,我可以与VisualVM连接,看看哪些线程正在占用CPU以及他们到底在做什么.但是,在生产环境中启用JMX远程是否存在重大缺陷?
是否有另一种方法可以查看哪些线程正在占用CPU并获得堆栈跟踪以查看它们在做什么?
还有其他想法吗?
谢谢!
使用Redis经历了非常高的响应延迟,在使用info命令时无法输出信息redis-cli.
此服务器处理来自大约200个并发进程的请求,但它不存储太多信息(至少据我们所知).当服务器响应时,该info命令报告使用的内存大约20 - 30 MB.
在top服务器上运行时,在高响应延迟期间,CPU使用率徘徊在95-100%左右.
造成这种行为的可能原因是什么?
我用JMeter创建了测试来测试Ghost博客平台的性能.Ghost用Node.js编写,安装在1Gb RAM,1个CPU的云服务器上.
我注意到400个并发用户JMeter收到错误后.直到400个并发用户负载是正常的.我决定增加CPU并增加1个CPU.
但错误再现并增加了2个CPU,共4个CPU.在400个并发用户之后出现问题.
我不明白为什么1个CPU可以处理400个用户,而4个CPU可以处理相同的结果.
在监视期间,我注意到只有一个CPU忙,另外三个CPU空闲.当我在控制台中检查JMeter摘要时出现错误,大约是请求的5%.见截图.

我想知道是否可以平衡CPU之间的负载?
为了测试我的应用程序(检测当前的CPU使用率),我需要在CPU上设置一个人工工作负载,例如:10%,20%,30%等,最高可达100%.有没有办法做到这一点?
我使用Ubuntu 14.04服务器(8核,16 GB RAM)来托管PHP网站,MySQL和Redis.PHP Web和MySQL的流量非常低(MySQL:每秒查询数:0.825).Redis每秒处理8011个命令.
今天我注意到nc保持在最高位置top:
8348 root 20 0 11224 764 624 R 100.0 0.0 2277:01 nc
8319 root 20 0 11224 760 624 R 100.0 0.0 2277:59 nc
8324 root 20 0 11224 764 624 R 100.0 0.0 2278:09 nc
8344 root 20 0 11224 760 624 R 100.0 0.0 2277:07 nc
Run Code Online (Sandbox Code Playgroud)
Stracing nc给出:
root@host:/home/user# strace -p 8348
Process 8348 attached
poll([{fd=3, events=POLLIN}, {fd=-1}], 2, 1000) = 1 ([{fd=3, revents=POLLERR}])
poll([{fd=3, events=POLLIN}, {fd=-1}], 2, 1000) = …Run Code Online (Sandbox Code Playgroud) 我只是想获得与任务管理器匹配的准确CPU使用率.到目前为止,我已经尝试了四种不起作用的推荐方法.
首先,我尝试了类似的解决方案或建议,我可以找到.这里的代码示例使用四种方法,所有方法都不准确.其次,我知道任务管理器会波动并取决于它何时被采样.这仍然没有考虑到差异.最后,我知道有不同的方法,任务管理器只使用一种方法.由于这适用于一般用户,因此需要靠近任务管理器.
public partial class MainWindow : Window
{
//*** Method 1 & 2
PerformanceCounter cpuCounterPi = new PerformanceCounter("Processor Information", "% Processor Time", "_Total");
PerformanceCounter cpuCounterP = new PerformanceCounter("Processor", "% Processor Time", "_Total");
//*** method 3
ManagementObjectSearcher query1 = new ManagementObjectSearcher("select loadpercentage from win32_processor");
//*** Mixed method usage below
CounterSample csPi1, csPi2, csP1, csP2;
double cpuPercentagePi, cpuPercentageP, cpuPercentageLoad;
int count = -1;
Boolean alternate = false;
System.Windows.Threading.DispatcherTimer dispatcherTimer = new System.Windows.Threading.DispatcherTimer();
public MainWindow()
{
InitializeComponent();
dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick);
dispatcherTimer.Interval …Run Code Online (Sandbox Code Playgroud) 我有一个有趣的案例给你.并需要帮助.
我的Mac应用程序有一个层托管的NSView,里面有很多层,子层和子子层.想象一个带有项目(图标,文本标签)的Finder窗口......就像那样.每个项目都有一个按钮,选择背景图层.
一切都很好,直到你有1000个这样的项目.
现在有很多这些项目,当我尝试与此视图交互时,我的应用程序变得没有响应.而棘手的部分是它不是我的应用程序消耗CPU,而是WindowServer.它达到100%并且系统冻结一段时间.
重要的提示:
我的观点是app界面的一部分.有一个主窗口,其他视图.它们也有自己的结构.
而且我注意到,如果我把这个图层托管的视图放到一个单独的窗口中,它可以正常工作,没有冻结具有相同的1000个项目.但是如果我把它放回主窗口就开始停止系统.
问题
我已经进行了一些测试并删除了每个项目的所有子图层,每个项目只留下一两个.它减轻了系统的负担,但仍然很糟糕.我已经禁用了所有图纸 - 只是图标的小图像.没有帮助.
我正在尝试使用HardwarePropertiesManager(https://developer.android.com/reference/android/os/HardwarePropertiesManager.html)访问信息。我正在使用带有以下代码的Android 7.0(API级别24):
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView helloTV = findViewById(R.id.helloTV);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
HardwarePropertiesManager hardwarePropertiesManager = getApplicationContext().getSystemService(HardwarePropertiesManager.class);
CpuUsageInfo[] cpuUsages = hardwarePropertiesManager.getCpuUsages();
///...
Now when my applications finds the hardwarePropertiesManager.getCpuUsages(); line it throws the following exception:
java.lang.RuntimeException: Unable to start activity ComponentInfo{gr.serafeim.sensorplayground/gr.serafeim.sensorplayground.MainActivity}: java.lang.SecurityException: The caller is not a device or profile owner or bound VrListenerService.
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2659)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2724)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1473)
at android.os.Handler.dispatchMessage(Handler.java:102) …