我正在尝试将项目从 .NET Framework 4.7.2 迁移到 .NET 5,但我的程序的性能显着下降。该程序的部分内容利用并行性在具有 96 个内核和 192 个逻辑处理器(分布在 4 个 CPU 组中)的服务器上进行批量操作。
我在安装了 .NET 5 Runtime(未安装 .NET 5 SDK)的 Windows Server 2016 上运行该程序。该项目是用 F# 5.0 编写的。
在 .NET Framework 4.7.2 中,我们使用以下app.config文件成功地使程序在所有 192 个逻辑处理器上运行,实现了约 98% 的 CPU 利用率:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<Thread_UseAllCpuGroups enabled="true" />
<GCCpuGroup enabled="true" />
<gcServer enabled="true" />
<gcAllowVeryLargeObjects enabled="true" />
</runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)
迁移到 .NET 5(以及扩展 .NET Core)后,CPU 利用率下降,并且我无法再次提高它。
根据微软自己的文档, app.config不用于配置.NET Core项目,而是用[appname].runtimeconfig.json. runtimeconfig.template.json为了适应这一变化,我在我的项目中添加了:
{
"configProperties": {
"System.GC.CpuGroup": …Run Code Online (Sandbox Code Playgroud) 我的 Dockerfile 执行RUN npm run build命令。当我docker build在 t2.micro EC2 实例上执行命令时,实例冻结并且不响应(我什至无法使用 ssh 连接)。当我监控CPU使用率时,我可以看到CPU使用率达到了最高水平。因此,我尝试使用--max_semi_space_size=1和--max_old_space_size=198参数来限制内存使用,但它不起作用。
如果我可以为 docker build 命令设置 CPU 使用限制,我认为它可能会起作用。有人能帮我吗?
我知道,如果我增加 EC2 实例的 vCPU 数量,那么我可以毫无问题地构建我的应用程序,但由于它是一个演示项目,我尝试将其部署在免费层上。
Dockerfile:
FROM node:16-alpine
COPY . .
# Install dependencies
RUN node \
--max_semi_space_size=1 \
--max_old_space_size=198 \
$(which npm) ci
# Build the app
RUN node \
--max_semi_space_size=1 \
--max_old_space_size=198 \
$(which npm) run build
EXPOSE 3000
# Start the app
CMD [ "npx", "serve", "build" ]
Run Code Online (Sandbox Code Playgroud) 我已经使用了计时器,我发现它在几秒或几毫秒内做出决定时非常有帮助.现在我强烈感觉到计时器的连续运行会逐渐增加处理器周期的消耗.
我已经创建了一个应用程序(C#)并使用'timer tick'来执行每1000毫秒(1秒)的"三个"指令,我注意到5分钟后应用程序消耗了5%的CPU能力,10%后消耗了10%.
如果这个进度保持不变那么如果我在后台运行我的应用程序会在4-5小时后发生什么?
我应该避免过度使用计时器吗?
private void currentTime_Tick(object sender, EventArgs e)
{
label1.Text = DateTime.Now.ToString("HH:mm:ss tt");
label2.Text = dt.AddSeconds(i).ToString("HH:mm:ss");
i++;
}
Run Code Online (Sandbox Code Playgroud) 下午好.我的CentOS 6(64位)服务器上的Java VM问题非常令人困惑.它是一个具有四核CPU(具有超线程),16GB RAM和2TB硬盘空间(在软件RAID1上)的服务器.我想我会在这里问一下,因为根据FAQ,关于开发人员使用的"常用工具"的问题是合适的.希望有人能够对这个问题有所了解.
我在服务器上运行一个Java软件,每天24小时.今天早些时候(在服务器的区域设置午夜后几小时检测到,这是值得注意的,因为它是一个月的第一天)我收到连接到该软件的用户的报告,因为客户端突然变得无法使用.JVM从未中断或重新启动.它仅在几天前重新启动,并且从那时起它一直正常运行(使用大约5%或更少的CPU,这是正常的).
这一次,当我检查过程时,它实际上吞噬了它可能从服务器上运行的其他应用程序(如上面报告的)所花费的所有CPU时间,或者,超过100%(由ps报告).我尝试停止并重新启动应用程序,但一旦运行,CPU使用率将立即再次高达100%以上.内存使用情况正常.我尝试了不同的JVM标志,但无济于事.我尝试下载最新版本的软件并进行全新安装,但这也无济于事.最后,我尝试下载另一个完全不同的Java软件,但是当我在服务器上运行它时,它遇到了同样的问题.
当我下载软件并在我的计算机上运行时,CPU使用率正常.因此,我假设服务器中存在错误,但我无法想象它可能是什么.服务器的JVM是最新的,来自标准的存储库包(无需任何自定义).
来自java -version:
java version "1.6.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.3) (rhel-1.48.1.11.3.el6_2-x86_64)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)
Run Code Online (Sandbox Code Playgroud)
来自uname -a:
2.6.32-131.21.1.el6.x86_64 #1 SMP Tue Nov 22 19:48:09 GMT 2011 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
从centos-release/redhat-release/system-release:
CentOS release 6.2 (Final)
Run Code Online (Sandbox Code Playgroud)
关于14.5gb免费RAM的免费报告.df报告/ home分区中有1.4tb可用磁盘空间(有问题的软件及其所有文件所在的位置).
有任何想法吗?请询问您是否需要更多数据,并随时建议我试用/检查程序.在查找问题时,我发现有几个人在JVM上窃取CentOS上的所有CPU时出现问题但是没有一个人能够解决我的问题.
在某些机器上,我的.Net应用程序在CPU使用率约为10%时闲置.我的第一个倾向是我的一个后台工作线程正在执行一些我不知道的指令,但我不知道如何通过线程隔离CPU使用(任务管理器只是告诉我我的进程使用x个线程[通常在30左右],而不是哪些线程占用CPU).
我知道,我编程可以通过迭代的线程中提到的这篇文章,但我不知道这是否会给我我需要的信息.是否有分析器(商业或其他)可以让我分析每个线程的CPU使用率?
我有一个NodeJS应用程序,它在24核心的服务器上生成进程.通常,我不会为每个核心生成多个进程(最多总共24个进程).我想知道每个进程产生的核心的CPU使用情况.有可能调查这样的事情吗?我知道我可以使用os.cpus(),但这会返回机器中所有CPU的更一般信息,而不是我正在查询的进程正在处理的那些CPU.
是否可以使用NodeJS中的内容执行此类操作?我不想依赖于从NodeJS执行(重)bash脚本来了解类似的东西.
我们在HAProxy后面的3台服务器上运行Asp.Net WebApi.HAProxy只是在这3个实例之间随机分配请求.
这些实例连接到mongodb,redis和一些Windows服务.
通常,w3wp.exe在每个api服务器上使用大约%30 cpu.
有时(一小时几次)其中一个api服务器决定使用大量的cpu.与此行为相关,我们开始看到响应时间增加.数字不断增加,直到HAProxy看到10000毫秒的响应时间,并决定将请求路由到其他两个服务器.所有这些都在10-20秒内发生.一段时间后,此服务器返回其正常状态并再次开始接收请求.几分钟后,另一台服务器做了完全相同的事情.这种情况一直持续下去.
我们正在使用New Relic,但由于该应用程序是WebApi应用程序,因此我们没有获得任何有用的信息.我们监控所有服务器(redis,mongo和windows服务)的CPU使用率,内存使用率,网络流量和I/O,但在上述中断期间我们没有看到任何重大负载.
我们如何检测此应用程序行为背后的原因?
我正在开发一个基于域模型架构的asp.Net MVC 4应用程序.
一切都很好,因为在开始调试会话后几天(升级了许多常见软件包)我可以看到CPU越来越高而没有任何(显而易见的)原因:浏览器中的应用程序仍然完全响应.
如果配置为"Release",则完全相同的源代码可以正常工作,并且我不会遇到任何CPU提升.
我在另外两台机器(Windows Server 2012 R2和Windows 7)上测试了相同的代码,一切正常(如果调试或发布,则无关紧要).
我最终在我的机器上创建了许多内存转储(Win 8.1),这是我发现在测试和监控上花了几天的时间:
http://screencast.com/t/hJa1V1V5ej
因此,即使我没有在Visual Studio中运行Page Inspector,似乎由于某种原因,Page Inspector在后台执行某些操作......
我实际上正在重新安装Visual Studio,看看能否以某种方式解决问题,希望我能走上正确的道路.
任何想法都会非常感激.
UPDATE
要解决此问题,我重命名了该文件夹
C:\ Program Files(x86)\ Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Microsoft\Web Tools\Page Inspector
到C:\ Program Files(x86)\ Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Microsoft\Web Tools\Page InspectorBLABLA.
这样,Visual Studio不再能够加载PageInspector库,并且问题不会显示出来.所以没有高CPU没有减速.当然,当VS启动时我遇到了一些错误:'Eureka包没有正确加载'和另一个更通用的错误.
我将安装最新的VS更新以查看问题是否已解决.
我正在使用一些代码来使用Java监视Cpu负载.我在我的应用程序中使用以下代码来获取系统负载
public static double getCPULoad() {
OperatingSystemMXBean osMBean
= (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
double load = osMBean.getSystemLoadAverage();
return load;
}
Run Code Online (Sandbox Code Playgroud)
但是在Windows上它会返回一个负值(-1.0).有什么办法可以解决这个问题吗?
您如何定义docker中google cadvisor提供的内存使用率指标?它是动态堆栈大小,堆需求,高速缓存未命中,代码大小,交换内存还是RAM内存?以及cpu的累计使用量,以哪个度量单位计算?您如何定义它?是否有任何文档?
注意:我记得cadvisor容器将资源使用情况数据导出到influxDB。他要导出的指标包括:memory_usage,cpu_cumulative_usage等。
谢谢