Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

Prior to doing some benchmarking work how would one free up the memory (RAM) that the Linux Kernel is consuming for its buffers and cache?

share|improve this question
    
What is the interest in open dup question and answer self? unix.stackexchange.com/questions/58553/… & unix.stackexchange.com/questions/17936/… –  innocent-world Aug 23 '13 at 13:59
    
@innocent-world - never saw these when I was searching, so it appeared to be a hole in the knowledge base on this site, and was attempting to fill it in. –  slm Aug 23 '13 at 14:01
1  
@innocent-world - in looking at those 2 Q's I think there is still room for this Q&A. This one acts as a canonical Q&A on the site. Those are fairly specific in what they're addressing. Additionally this one shows information about analyzing the buffers & cache and also how to set the parameters using sudo. Neither of the other 2 questions address any of this. –  slm Aug 23 '13 at 14:09
    
Thanks for sharing. It helped me a lot –  Cleveridge Aug 11 '14 at 14:30

3 Answers 3

up vote 98 down vote accepted

Emptying the buffers cache

If you ever want to empty it you can use this chain of commands.

# free && sync && echo 3 > /proc/sys/vm/drop_caches && free

             total       used       free     shared    buffers     cached
Mem:       1018916     980832      38084          0      46924     355764
-/+ buffers/cache:     578144     440772
Swap:      2064376        128    2064248
             total       used       free     shared    buffers     cached
Mem:       1018916     685008     333908          0        224     108252
-/+ buffers/cache:     576532     442384
Swap:      2064376        128    2064248

You can signal the Linux Kernel to drop various aspects of cached items by changing the numeric argument to the above command.

  • To free pagecache:

    # echo 1 > /proc/sys/vm/drop_caches
    
  • To free dentries and inodes:

    # echo 2 > /proc/sys/vm/drop_caches
    
  • To free pagecache, dentries and inodes:

    # echo 3 > /proc/sys/vm/drop_caches
    

The above are meant to be run as root. If you're trying to do them using sudo then you'll need to change the syntax slightly to something like these:

$ sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 2 >/proc/sys/vm/drop_caches'
$ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'

NOTE: There's a more esoteric version of the above command if you're into that:

$ echo "echo 1 > /proc/sys/vm/drop_caches" | sudo sh

Why the change in syntax? The /bin/echo program is running as root, because of sudo, but the shell that's redirecting echo's output to the root-only file is still running as you. Your current shell does the redirection before sudo starts.

Seeing what's in the buffers and cache

Take a look at linux-ftools if you'd like to analyze the contents of the buffers & cache. Specifically if you'd like to see what files are currently being cached.

fincore

With this tool you can see what files are being cached within a give directory.

fincore [options] files...

  --pages=false      Do not print pages
  --summarize        When comparing multiple files, print a summary report
  --only-cached      Only print stats for files that are actually in cache.

For example, /var/lib/mysql/blogindex:

root@xxxxxx:/var/lib/mysql/blogindex# fincore --pages=false --summarize --only-cached * 
stats for CLUSTER_LOG_2010_05_21.MYI: file size=93840384 , total pages=22910 , cached pages=1 , cached size=4096, cached perc=0.004365 
stats for CLUSTER_LOG_2010_05_22.MYI: file size=417792 , total pages=102 , cached pages=1 , cached size=4096, cached perc=0.980392 
stats for CLUSTER_LOG_2010_05_23.MYI: file size=826368 , total pages=201 , cached pages=1 , cached size=4096, cached perc=0.497512 
stats for CLUSTER_LOG_2010_05_24.MYI: file size=192512 , total pages=47 , cached pages=1 , cached size=4096, cached perc=2.127660 
stats for CLUSTER_LOG_2010_06_03.MYI: file size=345088 , total pages=84 , cached pages=43 , cached size=176128, cached perc=51.190476 
stats for CLUSTER_LOG_2010_06_04.MYD: file size=1478552 , total pages=360 , cached pages=97 , cached size=397312, cached perc=26.944444 
stats for CLUSTER_LOG_2010_06_04.MYI: file size=205824 , total pages=50 , cached pages=29 , cached size=118784, cached perc=58.000000 
stats for COMMENT_CONTENT_2010_06_03.MYI: file size=100051968 , total pages=24426 , cached pages=10253 , cached size=41996288, cached perc=41.975764 
stats for COMMENT_CONTENT_2010_06_04.MYD: file size=716369644 , total pages=174894 , cached pages=79821 , cached size=326946816, cached perc=45.639645 
stats for COMMENT_CONTENT_2010_06_04.MYI: file size=56832000 , total pages=13875 , cached pages=5365 , cached size=21975040, cached perc=38.666667 
stats for FEED_CONTENT_2010_06_03.MYI: file size=1001518080 , total pages=244511 , cached pages=98975 , cached size=405401600, cached perc=40.478751 
stats for FEED_CONTENT_2010_06_04.MYD: file size=9206385684 , total pages=2247652 , cached pages=1018661 , cached size=4172435456, cached perc=45.321117 
stats for FEED_CONTENT_2010_06_04.MYI: file size=638005248 , total pages=155763 , cached pages=52912 , cached size=216727552, cached perc=33.969556 
stats for FEED_CONTENT_2010_06_04.frm: file size=9840 , total pages=2 , cached pages=3 , cached size=12288, cached perc=150.000000 
stats for PERMALINK_CONTENT_2010_06_03.MYI: file size=1035290624 , total pages=252756 , cached pages=108563 , cached size=444674048, cached perc=42.951700 
stats for PERMALINK_CONTENT_2010_06_04.MYD: file size=55619712720 , total pages=13579031 , cached pages=6590322 , cached size=26993958912, cached perc=48.533080 
stats for PERMALINK_CONTENT_2010_06_04.MYI: file size=659397632 , total pages=160985 , cached pages=54304 , cached size=222429184, cached perc=33.732335 
stats for PERMALINK_CONTENT_2010_06_04.frm: file size=10156 , total pages=2 , cached pages=3 , cached size=12288, cached perc=150.000000 
---
total cached size: 32847278080

With the above output you can see that there are several *.MYD, *.MYI, and *.frm files that are currently being cached.

Swap

If you want to clear out your swap you can use the following commands.

$ free
             total       used       free     shared    buffers     cached
Mem:       7987492    7298164     689328          0      30416     457936
-/+ buffers/cache:    6809812    1177680
Swap:      5963772     609452    5354320

Then use this command to disable swap:

$ swapoff -a

You can confirm that it's now empty:

$ free
             total       used       free     shared    buffers     cached
Mem:       7987492    7777912     209580          0      39332     489864
-/+ buffers/cache:    7248716     738776
Swap:            0          0          0

And to re-enable it:

$ swapon -a

And now reconfirm with free:

$ free
             total       used       free     shared    buffers     cached
Mem:       7987492    7785572     201920          0      41556     491508
-/+ buffers/cache:    7252508     734984
Swap:      5963772          0    5963772
share|improve this answer
1  
never heard of linux-ftools after so many years, though I knew how to drop cache. you are really a guru. Thanks for sharing! –  johnshen64 Aug 23 '13 at 12:53
    
i tried this but every time i got "Permission denied" error, when i am a super user/admin and running command with sudo option in ubuntu. –  Gaurav Sharma Aug 23 '13 at 12:54
1  
You might also want to mention swapoff and swapon. –  terdon Aug 23 '13 at 14:05
1  
The things you say about sync are wrong: according to the linux doc, writting to drop_cache will only clear clean content (already synced). Besides, even if it drops unsynced data, saying that typing the sync command just before clearing cache would save your data is wrong: there is a non zero time between the sync command drop_cache write, so any data could be added during this time lapse. There is nothing atomic here. –  Congelli501 Nov 13 '14 at 22:06
1  
Prefer "sudo sysctl vm.drop_caches=1" over "sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches'" –  esperanto Apr 13 at 14:10

A more hammer and nail approach:

cat /dev/zero > /tmp/cache.cleaner ; rm -f /tmp/cache.cleaner

This even doesn't need root access!

(Assuming your /tmp is mounted as tmpfs with max size)

share|improve this answer
    
What exactly does this do? Very interesting. –  Michael Ozeryansky Dec 22 '14 at 8:47
2  
tmpfs is memory residing filesystem, when you filling tmpfs kernel will free up space for tmpfs by dropping caches and flushing buffers. –  Student Dec 22 '14 at 9:55
1  
Your proposal will fill up the disk, wear it out and leave currently running applications without free space for a while. –  esperanto Apr 13 at 14:12

Please read this article http://www.linuxatemyram.com/ If you understand the risk then you can do free && sync && echo 3 > /proc/sys/vm/drop_caches && free

share|improve this answer
2  
This is bordering on being a link only answer, which is not appropriate to the stackexchange family of sites. Please include the main points or the points most relevant from the linked article in your answer. –  hildred Mar 23 at 6:33
1  
I'm familiar with that site, the info in my answer is essentially the same. I used to include the sync but was shown several sources (see comments under my answer) which demonstrate that the syncs were not necessary. Given this this answer really doesn't add anything to this Q & A. –  slm Mar 23 at 11:11

protected by Community May 9 at 18:19

Thank you for your interest in this question. Because it has attracted low-quality answers, posting an answer now requires 10 reputation on this site.

Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged or ask your own question.