问题:

今天发现.Net Core 6程序,运行在一台Linux 2核2G内存的服务器中,响应静态文件特别慢。

于是一查,发现有个进程:kswapd0 进程 占用CPU 都200%。

该进程描述如下:

kswapd0 是 Linux 操作系统内核中的一个进程。它的主要工作是管理系统内存,包括回收不再使用的内存页面和交换空闲内存页面到磁盘上的交换文件或分区中。在系统需要更多物理内存时,kswapd0 进程负责从进程占用的虚拟内存中选择合适的页面并将其交换到物理内存中。

kswapd0 进程通常会占用一定比例的 CPU 和内存资源,这是正常的操作。如果你看到 kswapd0 进程占用了大量的 CPU 时间,可能表示系统内存使用不当,导致频繁的缺页中断和交换操作,从而导致系统变慢或出现“死机”等问题。

为了减少 kswapd0 占用过多资源的情况,可以尝试以下一些方法:

增加系统内存:如果系统物理内存不足,可能会导致频繁的交换操作,从而增加 kswapd0 的负载。增加系统内存可以显著改善系统性能。

优化系统内存使用:建议对系统进程进行适当调整,避免过多内存使用。可以使用 top 或者其他系统监控工具来查看系统中内存使用情况,可以有效帮助分析内存问题。

禁用交换分区:如果系统上存在空间较小的交换分区,可能会导致频繁的交换操作。在这种情况下,禁用交换分区可能对性能有所帮助,但需要进行充分评估和测试。

需要注意的是,kswapd0 进程是 Linux 操作系统内核的一个重要组成部分,应当尽可能避免通过终止进程等方法来尝试解决内存问题。因此,在面临内存问题时,建议先对系统进行全面分析和评估,并采取有效措施来优化系统性能。

大概是内存不足引发的。

针对kswapd0的解决方案:

1、查看swappiness参数:级别从0-100
# cat /proc/sys/vm/swappiness

2、如果较大,可以调到最低0

# vi /etc/sysctl.conf
#最后一行加上
vm.swappiness=0

3、保存后:重新加载参数
# sysctl -p

 

结束该进程【kill -9 kswapd】后,查看两个dotnet进程,各占400M左右。

重启dotnet进程,发现刷新界面会造成内存以M的速度增长,持续到400M左右才停止。

想着该服务器内存不大,就想降一下内存,经查明。

该问题是由于Net Core 的GC 模式引发的。

.NET Core 两种GC模式介绍:

Server GC :

主要应用于多处理器系统,并且作为ASP.NET Core宿主的默认配置。它会为每个处理器都创建一个GC Heap,并且会并行执行回收操作。该模式的GC可以最大化吞吐量和较好的收缩性。这种模式的特点是初始分配的内存较大,并且尽可能不回收内存,进行回收用时会很耗时,并进行内存碎片整理工作。用一句简单的话说,这个就是贪婪模式,通过尽可能多的获得内存和少回收来得到更好的性能。结果就是高内存使用率性能较好。

Workstation GC :

主要应用于单处理器系统,Workstation GC尽可能地通过减少垃圾回收过程中程序的暂停次数来提高性能。低负载且不常在后台(如服务)执行任务的应用程序,可以在禁用并发垃圾回收的情况下使用工作站垃圾回收。特点是会频繁回收,来阻止一次较长时间的回收。结果就是低内存使用率性能较差。

 

知道模式后,只要对应进行相应的配置即可:

开发环境

工程文件右键编辑项目文件,加上以下配置,重新生成即可:

<PropertyGroup> 
  <ServerGarbageCollection>false</ServerGarbageCollection> 
</PropertyGroup>

生产环境

bin目录下程序中找到 *.runtimeconfig.json,修改如下:

"configProperties": {
  "System.GC.Server": false
 }

进行相关配置后,提交后,重新刷新界面,内存持续增长,大概100M多后,即停止增长。

posted on 2023-06-02 15:51  路过秋天  阅读(1142)  评论(0编辑  收藏  举报
路过秋天