I have an embedded system running 2.6.10 linux kernel (I know!) and I noticed that as the system stays up for longer periods of time, the "cached" usage of RAM - as seen in /proc/meminfo - increases linearly. Sometimes it reaches up to 70% of total RAM and the system crashes.
I don't know why this space wasn't automatically re-claimed by the kernel during low memory conditions. I thought the "cached" memory, though used, is still considered readily "available".
In order to atleast manually reclaim this space, I would have to tweak the drop_caches setting in /proc/sys/vm/. However, this feature was only introduce in the 2.6.16 kernel.
Since a large part of what's in "cached" is the page cache, file and inode caches, is there any way to forefully reclaim them without the drop_caches feature? I've tried sync
, but that didn't help at all.
I've googled a lot about this but couldn't find any resources that don't somehow rely on the drop_caches feature.
EDIT:
Following advice from a few other threads, I ran a test that wrote to the on-board flash partition every seconds and I see both the dentry
and size-64
fields go up in /proc/slabinfo
(at the rate of 1 per loop of the bash script). However, I didn't notice any increase in the Cached
memory usage.
MORE INFO:
I must mention that the root directory itself is in ramfs. I do have a flash chip that we read/write from, but too frequently. I've pasted the meminfo and slabinfo taken sometime before the crash. Notice how the active and cached fields add to greater than the total available memory!
MemTotal: 256708 kB
MemFree: 4896 kB
Buffers: 0 kB
Cached: 181892 kB
SwapCached: 0 kB
Active: 178140 kB
Inactive: 46496 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 256708 kB
LowFree: 4896 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 0 kB
Writeback: 0 kB
Mapped: 56656 kB
Slab: 11252 kB
CommitLimit: 128352 kB
Committed_AS: 175668 kB
PageTables: 908 kB
VmallocTotal: 737280 kB
VmallocUsed: 113084 kB
VmallocChunk: 624100 kB
slabinfo - version: 2.1
# name <active_objs> <num_objs> <objsize> <objperslab> <pagesperslab> : tunables <batchcount> <limit> <sharedfactor> : slabdata <active_slabs> <num_slabs> <sharedavail>
rwsem_lock_cache 0 0 64 59 1 : tunables 120 60 0 : slabdata 0 0 0
rwsem_owner_cache 16 59 64 59 1 : tunables 120 60 0 : slabdata 1 1 0
rwsem_sap_cache 0 0 128 30 1 : tunables 120 60 0 : slabdata 0 0 0
pss_node_cache 0 0 32 113 1 : tunables 120 60 0 : slabdata 0 0 0
mts-sapinfo-cache 0 0 1152 7 2 : tunables 24 12 0 : slabdata 0 0 0
mts-sap-desc-cache 34 36 448 9 1 : tunables 54 27 0 : slabdata 4 4 0
mts-qentry-cache 5 59 64 59 1 : tunables 120 60 0 : slabdata 1 1 0
mts-rcpnt-cache 1 1 5568 1 2 : tunables 8 4 0 : slabdata 1 1 0
rpc_buffers 8 8 2048 2 1 : tunables 24 12 0 : slabdata 4 4 0
rpc_tasks 8 24 160 24 1 : tunables 120 60 0 : slabdata 1 1 0
rpc_inode_cache 0 0 416 9 1 : tunables 54 27 0 : slabdata 0 0 0
unix_sock 70 70 384 10 1 : tunables 54 27 0 : slabdata 7 7 0
tcp_tw_bucket 0 0 96 40 1 : tunables 120 60 0 : slabdata 0 0 0
tcp_bind_bucket 25 203 16 203 1 : tunables 120 60 0 : slabdata 1 1 0
tcp_open_request 2 59 64 59 1 : tunables 120 60 0 : slabdata 1 1 0
inet_peer_cache 4 59 64 59 1 : tunables 120 60 0 : slabdata 1 1 0
ip_fib_alias 23 203 16 203 1 : tunables 120 60 0 : slabdata 1 1 0
ip_fib_hash 23 113 32 113 1 : tunables 120 60 0 : slabdata 1 1 0
ip_dst_cache 34 45 256 15 1 : tunables 120 60 0 : slabdata 3 3 0
arp_cache 13 24 160 24 1 : tunables 120 60 0 : slabdata 1 1 0
raw_sock 8 8 480 8 1 : tunables 54 27 0 : slabdata 1 1 0
udp_sock 7 8 480 8 1 : tunables 54 27 0 : slabdata 1 1 0
tcp_sock 29 36 1024 4 1 : tunables 54 27 0 : slabdata 9 9 0
flow_cache 0 0 96 40 1 : tunables 120 60 0 : slabdata 0 0 0
cfq_ioc_pool 0 0 24 145 1 : tunables 120 60 0 : slabdata 0 0 0
cfq_pool 0 0 104 37 1 : tunables 120 60 0 : slabdata 0 0 0
crq_pool 0 0 52 72 1 : tunables 120 60 0 : slabdata 0 0 0
deadline_drq 0 0 48 78 1 : tunables 120 60 0 : slabdata 0 0 0
as_arq 4 63 60 63 1 : tunables 120 60 0 : slabdata 1 1 0
mqueue_inode_cache 1 8 480 8 1 : tunables 54 27 0 : slabdata 1 1 0
jffs2_inode_cache 24 145 24 145 1 : tunables 120 60 0 : slabdata 1 1 0
jffs2_node_frag 36493 36576 28 127 1 : tunables 120 60 0 : slabdata 288 288 0
jffs2_raw_node_ref 52018 52171 16 203 1 : tunables 120 60 0 : slabdata 257 257 0
jffs2_tmp_dnode 0 0 24 145 1 : tunables 120 60 0 : slabdata 0 0 0
jffs2_raw_inode 0 0 68 56 1 : tunables 120 60 0 : slabdata 0 0 0
jffs2_raw_dirent 0 0 40 92 1 : tunables 120 60 0 : slabdata 0 0 0
jffs2_full_dnode 36494 36540 16 203 1 : tunables 120 60 0 : slabdata 180 180 0
jffs2_i 13 24 328 12 1 : tunables 54 27 0 : slabdata 2 2 0
nfs_write_data 36 36 448 9 1 : tunables 54 27 0 : slabdata 4 4 0
nfs_read_data 32 36 448 9 1 : tunables 54 27 0 : slabdata 4 4 0
nfs_inode_cache 0 0 544 7 1 : tunables 54 27 0 : slabdata 0 0 0
nfs_page 0 0 64 59 1 : tunables 120 60 0 : slabdata 0 0 0
dnotify_cache 0 0 20 169 1 : tunables 120 60 0 : slabdata 0 0 0
kioctx 0 0 192 20 1 : tunables 120 60 0 : slabdata 0 0 0
kiocb 0 0 128 30 1 : tunables 120 60 0 : slabdata 0 0 0
fasync_cache 0 0 16 203 1 : tunables 120 60 0 : slabdata 0 0 0
shmem_inode_cache 169 170 384 10 1 : tunables 54 27 0 : slabdata 17 17 0
posix_timers_cache 0 0 100 39 1 : tunables 120 60 0 : slabdata 0 0 0
uid_cache 0 0 64 59 1 : tunables 120 60 0 : slabdata 0 0 0
blkdev_ioc 0 0 24 145 1 : tunables 120 60 0 : slabdata 0 0 0
blkdev_queue 25 30 368 10 1 : tunables 54 27 0 : slabdata 3 3 0
blkdev_requests 4 28 140 28 1 : tunables 120 60 0 : slabdata 1 1 0
biovec-(256) 256 256 3072 2 2 : tunables 24 12 0 : slabdata 128 128 0
biovec-128 256 260 1536 5 2 : tunables 24 12 0 : slabdata 52 52 0
biovec-64 256 260 768 5 1 : tunables 54 27 0 : slabdata 52 52 0
biovec-16 256 260 192 20 1 : tunables 120 60 0 : slabdata 13 13 0
biovec-4 256 295 64 59 1 : tunables 120 60 0 : slabdata 5 5 0
biovec-1 256 406 16 203 1 : tunables 120 60 0 : slabdata 2 2 0
bio 256 295 64 59 1 : tunables 120 60 0 : slabdata 5 5 0
file_lock_cache 65 80 96 40 1 : tunables 120 60 0 : slabdata 2 2 0
sock_inode_cache 121 121 352 11 1 : tunables 54 27 0 : slabdata 11 11 0
skbuff_head_cache 560 560 192 20 1 : tunables 120 60 0 : slabdata 28 28 0
sock 9 12 320 12 1 : tunables 54 27 0 : slabdata 1 1 0
proc_inode_cache 1196 1196 304 13 1 : tunables 54 27 0 : slabdata 92 92 0
sigqueue 26 26 148 26 1 : tunables 120 60 0 : slabdata 1 1 0
radix_tree_node 2030 2030 276 14 1 : tunables 54 27 0 : slabdata 145 145 0
bdev_cache 1 9 416 9 1 : tunables 54 27 0 : slabdata 1 1 0
mnt_cache 20 40 96 40 1 : tunables 120 60 0 : slabdata 1 1 0
inode_cache 2665 2665 288 13 1 : tunables 54 27 0 : slabdata 205 205 0
dentry_cache 4147 4147 136 29 1 : tunables 120 60 0 : slabdata 143 143 0
filp 1380 1440 160 24 1 : tunables 120 60 0 : slabdata 60 60 0
names_cache 4 4 4096 1 1 : tunables 24 12 0 : slabdata 4 4 0
idr_layer_cache 97 116 136 29 1 : tunables 120 60 0 : slabdata 4 4 0
buffer_head 0 0 48 78 1 : tunables 120 60 0 : slabdata 0 0 0
mm_struct 44 49 544 7 1 : tunables 54 27 0 : slabdata 7 7 0
vm_area_struct 3452 3680 84 46 1 : tunables 120 60 0 : slabdata 80 80 0
fs_cache 45 113 32 113 1 : tunables 120 60 0 : slabdata 1 1 0
files_cache 42 45 416 9 1 : tunables 54 27 0 : slabdata 5 5 0
signal_cache 57 60 256 15 1 : tunables 120 60 0 : slabdata 4 4 0
sighand_cache 55 60 1312 3 1 : tunables 24 12 0 : slabdata 20 20 0
task_struct 96 100 960 4 1 : tunables 54 27 0 : slabdata 25 25 0
anon_vma 1273 1356 8 339 1 : tunables 120 60 0 : slabdata 4 4 0
size-131072(DMA) 0 0 131072 1 32 : tunables 8 4 0 : slabdata 0 0 0
size-131072 1 1 131072 1 32 : tunables 8 4 0 : slabdata 1 1 0
size-65536(DMA) 0 0 65536 1 16 : tunables 8 4 0 : slabdata 0 0 0
size-65536 0 0 65536 1 16 : tunables 8 4 0 : slabdata 0 0 0
size-32768(DMA) 0 0 32768 1 8 : tunables 8 4 0 : slabdata 0 0 0
size-32768 1 1 32768 1 8 : tunables 8 4 0 : slabdata 1 1 0
size-16384(DMA) 0 0 16384 1 4 : tunables 8 4 0 : slabdata 0 0 0
size-16384 8 8 16384 1 4 : tunables 8 4 0 : slabdata 8 8 0
size-8192(DMA) 0 0 8192 1 2 : tunables 8 4 0 : slabdata 0 0 0
size-8192 3 3 8192 1 2 : tunables 8 4 0 : slabdata 3 3 0
size-4096(DMA) 0 0 4096 1 1 : tunables 24 12 0 : slabdata 0 0 0
size-4096 278 278 4096 1 1 : tunables 24 12 0 : slabdata 278 278 0
size-2048(DMA) 0 0 2048 2 1 : tunables 24 12 0 : slabdata 0 0 0
size-2048 292 292 2048 2 1 : tunables 24 12 0 : slabdata 146 146 0
size-1024(DMA) 0 0 1024 4 1 : tunables 54 27 0 : slabdata 0 0 0
size-1024 60 60 1024 4 1 : tunables 54 27 0 : slabdata 15 15 0
size-512(DMA) 0 0 512 8 1 : tunables 54 27 0 : slabdata 0 0 0
size-512 216 216 512 8 1 : tunables 54 27 0 : slabdata 27 27 0
size-256(DMA) 0 0 256 15 1 : tunables 120 60 0 : slabdata 0 0 0
size-256 76 90 256 15 1 : tunables 120 60 0 : slabdata 6 6 0
size-192(DMA) 0 0 192 20 1 : tunables 120 60 0 : slabdata 0 0 0
size-192 139 140 192 20 1 : tunables 120 60 0 : slabdata 7 7 0
size-128(DMA) 0 0 128 30 1 : tunables 120 60 0 : slabdata 0 0 0
size-128 857 870 128 30 1 : tunables 120 60 0 : slabdata 29 29 0
size-96(DMA) 0 0 96 40 1 : tunables 120 60 0 : slabdata 0 0 0
size-96 1049 1080 96 40 1 : tunables 120 60 0 : slabdata 27 27 0
size-64(DMA) 0 0 64 59 1 : tunables 120 60 0 : slabdata 0 0 0
size-64 4425 4425 64 59 1 : tunables 120 60 0 : slabdata 75 75 0
size-32(DMA) 0 0 32 113 1 : tunables 120 60 0 : slabdata 0 0 0
size-32 4633 4633 32 113 1 : tunables 120 60 0 : slabdata 41 41 0
kmem_cache 120 120 128 30 1 : tunables 120 60 0 : slabdata 4 4 0
I think you have a tmpfs/ramfs filling up somewhere. Due to the way tmpfs/ramfs works, the space used by files on a tmpfs is counted as "Cached" by the Linux kernel. A file on a tmpfs/ramfs is essentially nothing more than an unbacked cache entry.
# echo 1 > /proc/sys/vm/drop_caches
# grep '^Cached' /proc/meminfo
Cached: 1341824 kB
# dd if=/dev/zero of=/tmp/testfile bs=1G count=4
4+0 records in
4+0 records out
4294967296 bytes (4.3 GB) copied, 1.33696 s, 3.2 GB/s
# grep '^Cached' /proc/meminfo
Cached: 5543480 kB
# echo 1 > /proc/sys/vm/drop_caches
# grep '^Cached' /proc/meminfo
Cached: 5494072 kB
# rm /tmp/testfile
# grep '^Cached' /proc/meminfo
Cached: 1306488 kB
This is "cache" memory that Linux can't reclaim automatically since it isn't backed by any real persistent storage. As you can see in the example, even drop_caches
wouldn't help you.
So have a look in /proc/mounts
for any tmpfs/ramfs that are mounted and monitor which of those are filling up.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With