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)
根据您的评论,您说缓存使用量在您尝试时不会明显下降 echo 3 > /proc/sys/vm/drop_caches
仅当这是用于写入的缓存时才会发生这种情况。如果您将 5 GB 写入某些文件,数据会立即进入缓存,您的程序将继续运行。缓存实际上是尽可能快地在后台写入存储。在您的情况下,存储似乎非常缓慢,并且您积累了未写入的缓存,直到耗尽所有 RAM 并开始将所有内容推送到交换中。
内核永远不会将缓存写入交换分区。它将它保存在 RAM 中,直到它被安全地写入目的地。
内核永远不会丢弃未写入的缓存,因为这会导致数据丢失(您已经保存了一个文件,因此您希望数据会落在永久存储上)。
您只能通过加快存储来解决它。安装通过网络这个问题上常常看到存储(检查您mount的类型cifs,nfs,sshfs,等)或慢USB1设备。
您还可以通过在脏缓存sysctl vm.dirty_ratio=10增长过多之前对其进行限制来使问题对系统不那么严重。
脏比率
包含(作为包含空闲页和可回收页的总可用内存的百分比)的页数,在该页数中,正在生成磁盘写入的进程本身将开始写出脏数据。
总可用内存不等于总系统内存。
如果这是一个正确的诊断,您将看到可以轻松删除缓存(至少 90%),并且写入这些 GB 的过程变得非常缓慢。系统的其余部分将变得更加敏感。