
我正在運行 top,發現在 502968 KB 中,已使用 48064 KB,剩下 16884 KB 可用。但是當我查看各個進程時,我發現 mysql 有時消耗了我的 RAM 的 9.4% - 但其他似乎沒有消耗任何東西。是什麼消耗了我所有的 RAM?
這是頂部的螢幕截圖:
top - 20:46:07 up 1 min, 1 user, load average: 0.18, 0.05, 0.02
Tasks: 81 total, 1 running, 80 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.4 sy, 0.0 ni, 99.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 502968 total, 241236 used, 261732 free, 10488 buffers
KiB Swap: 524284 total, 0 used, 524284 free, 106756 cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1584 dmackey 20 0 20508 1372 1000 R 0.4 0.3 0:00.01 top
1 root 20 0 26664 2456 1340 S 0.0 0.5 0:00.69 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.01 ksoftirqd/0
4 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/u:0
7 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/u:0H
8 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
10 root 20 0 0 0 0 S 0.0 0.0 0:00.24 rcu_sched
11 root rt 0 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
12 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 cpuset
13 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper
14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
16 root 20 0 0 0 0 S 0.0 0.0 0:00.00 bdi-default
這是免費的:
total used free shared buffers cached
Mem: 502968 355252 147716 0 10816 111548
-/+ buffers/cache: 232888 270080
Swap: 524284 0 524284
答案1
沒有什麼。
這是Linux,那就是怎麼運作的。
它將使用「空閒」記憶體進行磁碟緩存,因為資源未充分利用有什麼意義呢?
當進程需要更多記憶體時,它會向核心請求,並且(通常)獲取它。
哦.. MySQL 將使用盡可能多的資源(如 中配置的那樣/etc/my.cnf
),以便將索引、查詢和表從磁碟快取到記憶體中,從而加快存取速度。
答案2
它只是最後一次使用時遺留在記憶體中的任何垃圾。最有可能的是,它是從磁碟讀取或寫入磁碟的資料。作業系統不會釋放內存,因為這會造成浪費,原因有三:
如果記憶體沒有很快被使用,那麼釋放它不會有任何效果。
如果記憶體很快就被使用,那麼釋放它只是必須撤消的工作,因為必須再次使用它。
如果再次需要記憶體中的信息,釋放記憶體將意味著必須從磁碟而不是記憶體中獲取該信息,後者速度要慢得多。
現代作業系統只有在別無選擇的情況下才會釋放記憶體。如果您在想:“我現在想要釋放該內存,以便以後可以使用它”,請停下來。您不需要現在釋放記憶體以便稍後使用。這裡沒有權衡,在需要時保持記憶體使用是純粹的勝利。
答案3
記錄 top 的輸出以供將來分析是回答您的問題的最佳方式。沒有快速解決辦法,需要隨著時間的推移進行一些觀察調查。我用來瀏覽正在使用我的記憶體的內容的一次性方法是將其放入 root 的 crontab 中。
/bin/bash top -b -n 1 | head > `/var/log/date +%e_%T`
然後我使用一些文字操作和尋呼機來追蹤趨勢。這個堆疊溢位帖子https://stackoverflow.com/questions/7908953/how-to-measure-cpu-usage有一些像這樣使用 top 的更全面的示例,以及通過 自定義 top via.toprc
來獲取 CPU 統計信息,但它也可以輕鬆地進行調整以滿足您的需求。