非常高的缓存使用率导致速度变慢

Luk*_*ley 4 cache memory-usage ram memory-leak

我正在尝试找出导致我的个人计算机非常缓慢的罪魁祸首。最大的嫌疑是记忆。当计算机运行得很快时,我的缓存看起来很正常。但是,当它运行缓慢时,它看起来像这样:

luke@Luke-XPS-13:~$ free -m
              total        used        free      shared  buff/cache   available
Mem:           7830        1111        1090         277        5628        1257
Swap:         16077         665       15412
Run Code Online (Sandbox Code Playgroud)

和这个:

luke@Luke-XPS-13:~$ vmstat -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 3  0    665   1065     67   5562    0    0    34    88   43   23 13  4 82  0  0
Run Code Online (Sandbox Code Playgroud)

缓存占用了我的 8GB 内存中的 5.5GB,当所有程序都关闭时,并在运行后

echo "echo 3 > /proc/sys/vm/drop_caches"
Run Code Online (Sandbox Code Playgroud)

这应该是强制清除它们。一旦计算机开始进入交换,它的游戏就会以可用的速度结束。关机暂时解决了这个问题,但它最终又回来了,我不知道是什么导致了它。Slabtop 稍微透露了更多关于罪魁祸首的信息,但我不确定这意味着什么。为什么kmalloc-4096

 Active / Total Objects (% used)    : 1554043 / 1607539 (96.7%)
 Active / Total Slabs (% used)      : 167569 / 167569 (100.0%)
 Active / Total Caches (% used)     : 76 / 109 (69.7%)
 Active / Total Size (% used)       : 5091450.96K / 5105920.97K (99.7%)
 Minimum / Average / Maximum Object : 0.01K / 3.18K / 18.50K

  OBJS ACTIVE  USE OBJ SIZE  SLABS OBJ/SLAB CACHE SIZE NAME                   
1254755 1254755 100%  4.00K 156847        8   5019104K kmalloc-4096
  5430   5430 100%    2.05K    362       15     11584K idr_layer_cache
 20216   9010  44%    0.57K    722       28     11552K radix_tree_node
  8820   7358  83%    1.05K    294       30      9408K ext4_inode_cache
 38577  25253  65%    0.19K   1837       21      7348K dentry
 12404  11432  92%    0.55K    443       28      7088K inode_cache
 30120  29283  97%    0.20K   1506       20      6024K vm_area_struct
 31722  31722 100%    0.12K    933       34      3732K kernfs_node_cache
 13696  12514  91%    0.25K    856       16      3424K kmalloc-256
 27144  27134  99%    0.10K    696       39      2784K buffer_head
 41088  29789  72%    0.06K    642       64      2568K kmalloc-64
   632    567  89%    3.75K     79        8      2528K task_struct
  2432   2274  93%    1.00K    152       16      2432K kmalloc-1024
  3048   2677  87%    0.64K    127       24      2032K shmem_inode_cache
   912    845  92%    2.00K     57       16      1824K kmalloc-2048
   172    162  94%    8.00K     43        4      1376K kmalloc-8192
  1736   1561  89%    0.56K     62       28       992K ecryptfs_key_record_cache
  5103   4073  79%    0.19K    243       21       972K kmalloc-192
  1792   1626  90%    0.50K    112       16       896K kmalloc-512
  1456   1456 100%    0.61K     56       26       896K proc_inode_cache
 10149   8879  87%    0.08K    199       51       796K anon_vma
 24960  19410  77%    0.03K    195      128       780K kmalloc-32
   360    352  97%    2.06K     24       15       768K sighand_cache
Run Code Online (Sandbox Code Playgroud)

kub*_*zyk 6

根据您的评论,您说缓存使用量在您尝试时不会明显下降 echo 3 > /proc/sys/vm/drop_caches

仅当这是用于写入的缓存时才会发生这种情况。如果您将 5 GB 写入某些文件,数据会立即进入缓存,您的程序将继续运行。缓存实际上是尽可能快地在后台写入存储。在您的情况下,存储似乎非常缓慢,并且您积累了未写入的缓存,直到耗尽所有 RAM 并开始将所有内容推送到交换中。

内核永远不会将缓存写入交换分区。它将它保存在 RAM 中,直到它被安全地写入目的地。

内核永远不会丢弃未写入的缓存,因为这会导致数据丢失(您已经保存了一个文件,因此您希望数据会落在永久存储上)。

您只能通过加快存储来解决它。安装通过网络这个问题上常常看到存储(检查您mount的类型cifsnfssshfs,等)或慢USB1设备。

您还可以通过在脏缓存sysctl vm.dirty_ratio=10增长过多之前对其进行限制来使问题对系统不那么严重。

脏比率

包含(作为包含空闲页和可回收页的总可用内存的百分比)的页数,在该页数中,正在生成磁盘写入的进程本身将开始写出脏数据。

总可用内存不等于总系统内存。

如果这是一个正确的诊断,您将看到可以轻松删除缓存(至少 90%),并且写入这些 GB 的过程变得非常缓慢。系统的其余部分将变得更加敏感。

  • 或者 - 出现故障的存储设备。检查日志和智能状态。 (2认同)