> Linux系統內存使用狀況主要存儲在/proc/meminfo中,”free”、”vmstat”等命令就是通過它獲取數據的。
[TOC]
# <span style="font-size:15px">1、通過 cat /proc/meminfo查看</span>
```
[root@localhost ~]# cat /proc/meminfo
MemTotal: 32656556 kB // 可供系統支配的內存 (即物理內存減去一些預留位和內核的二進制代碼大小)
MemFree: 13060828 kB // LowFree與HighFree的總和,系統中未使用的內存
MemAvailable: 27306600 kB // 應用程序可用內存,MemAvailable≈MemFree+Buffers+Cached,它與MemFree的關鍵區別點在于,MemFree是說的系統層面,MemAvailable是說的應用程序層面
Buffers: 2080 kB // 緩沖區內存數,對原始磁盤塊的臨時存儲,也就是用來緩存磁盤的數據,通常不會特別大 (20MB 左右)
Cached: 15397548 kB // 緩存區內存數
SwapCached: 0 kB // 交換文件中的已經被交換出來的內存。與 I/O 相關
Active: 9556388 kB // 經常(最近)被使用的內存
Inactive: 8106580 kB // 最近不常使用的內存。這很容易被系統移做他用
Active(anon): 3351300 kB // 活躍的匿名內存(進程中堆上分配的內存,是用malloc分配的內存)
Inactive(anon): 823400 kB // 不活躍的匿名內存
Active(file): 6205088 kB // 活躍的與文件關聯的內存(比如程序文件、數據文件所對應的內存頁)
Inactive(file): 7283180 kB // 不活躍的與文件關聯的內存
Unevictable: 0 kB // 不能被釋放的內存頁
Mlocked: 0 kB // mlock()系統調用鎖定的內存大小
SwapTotal: 16450556 kB // 交換空間總大小
SwapFree: 16450556 kB // 空閑的交換空間大小
Dirty: 12 kB // 等待被寫回到磁盤的大小
Writeback: 0 kB // 正在被寫回的大小
AnonPages: 2263468 kB // 未映射頁的大小
Mapped: 343264 kB // 設備和文件映射大小
Shmem: 1911344 kB // 已經被分配的共享內存大小
Slab: 1472540 kB // 內核數據結構緩存大小
SReclaimable: 1189988 kB // 可收回Slab的大小
SUnreclaim: 282552 kB // 不可收回的Slab的大小
KernelStack: 17312 kB // kernel消耗的內存
PageTables: 34020 kB // 管理內存分頁的索引表的大小
NFS_Unstable: 0 kB // 不穩定頁表的大小
Bounce: 0 kB // 在低端內存中分配一個臨時buffer作為跳轉,把位于高端內存的緩存數據復制到此處消耗的內存
WritebackTmp: 0 kB // 用于臨時寫回緩沖區的內存
CommitLimit: 32778832 kB // 系統實際可分配內存總量
Committed_AS: 9836288 kB // 當前已分配的內存總量
VmallocTotal: 34359738367 kB // 虛擬內存大小
VmallocUsed: 392428 kB // 已經被使用的虛擬內存大小
VmallocChunk: 34342156284 kB // 在 vmalloc 區域中可用的最大的連續內存塊的大小
HardwareCorrupted: 0 kB // 刪除掉的內存頁的總大小(當系統檢測到內存的硬件故障時)
AnonHugePages: 1552384 kB // 匿名 HugePages 數量
CmaTotal: 0 kB // 連續可用內存總數
CmaFree: 0 kB // 空閑的連續可用內存
HugePages_Total: 0 // 預留HugePages的總個數
HugePages_Free: 0 // 尚未分配的 HugePages 數量
HugePages_Rsvd: 0 // 已經被應用程序分配但尚未使用的 HugePages 數量
HugePages_Surp: 0 // 這個值得意思是當開始配置了20個大頁,現在修改配置為16,那么這個參數就會顯示為4,一般不修改配置,這個值都是0
Hugepagesize: 2048 kB // 每個大頁的大小
DirectMap4k: 320240 kB // 映射TLB為4kB的內存數量
DirectMap2M: 7972864 kB // 映射TLB為2M的內存數量
DirectMap1G: 27262976 kB // 映射TLB為1G的內存數量
```
**buffers和cached解析**
* 緩存(cached):緩存區,高速緩存,是位于CPU與主內存間的一種容量較小但速度很高的存儲器。是把讀取過的數據保存起來,重新讀取時若緩存中存在就不會重新去讀硬盤了。其中的數據會根據讀取頻率進行排序,把最頻繁讀取的內容放在最容易找到的位置,把不再讀的內容不斷往后排。
* 緩沖(buffers):緩沖區,一個用于存儲速度不同步的設備或優先級不同的設備之間傳輸數據的區域。是根據磁盤的讀寫設計的,把分散的寫操作集中進行,減少磁盤碎片和硬盤的反復尋道,從而提高系統性能。linux有一個守護進程定期清空緩沖內容(即寫入磁盤),也可以通過sync命令手動清空緩沖。
**buffers和cached區別**:
* cache是高速緩存,用于CPU和內存之間的緩沖;
* buffer是I/O緩存,用于內存和硬盤的緩沖;
# <span style="font-size:15px">2、查看顯示內存狀態:free [option] [-s <間隔秒數>]</span>
> * \-b 以Byte為單位顯示內存使用情況。
> * \-k 以KB為單位顯示內存使用情況。
> * \-m 以MB為單位顯示內存使用情況。
> * \-h 以合適的單位顯示內存使用情況,最大為三位數,自動計算對應的單位值。單位有:(B = bytes、K = kilos、M = megas、G = gigas、T = teras)
> * \-o 不顯示緩沖區調節列。
> * \-s 持續觀察內存使用狀況。
> * \-t 顯示內存總和列。
```
// centos7.4為例(centos7與centos6輸出結果有所不同)
[root@izwz91quxhnlkan8kjak5hz ~]# free -h
total used free shared buff/cache available
Mem: 1.8G 332M 113M 17M 1.4G 1.3G
Swap: 1.0G 0B 1.0G
// 字段解析:
// Mem行:表示物理內存統計
// 1. total 表示物理內存總量;
// 2. used表示總計分配給緩存(包含buffers 與cache )使用的數量,但其中可能部分緩存并未實際使用
// 3. free表示未被分配的內存
// 4. shared表示共享內存,一般系統不會用到
// 5. buff/cache表示系統分配但未被使用的緩存大小
// 6. available對應著/prco/meminfo 中的MemAvailable
// Swap行:表示硬盤上交換分區的使用情況
// 1. total表示交換分區上的內存總量
// 2. used表示已經使用的交換空間容量
// 3. free表示可用的交換空間容量
```
# <span style="font-size:15px">3、查看虛擬內存使用狀態:vmstat [option]</span>
> 命令:
>vmstat \[-a\] \[-n\] \[-S unit\] \[delay \[ count\]\]
> vmstat \[-s\] \[-n\] \[-S unit\]
> vmstat \[-m\] \[-n\] \[delay \[ count\]\]
> vmstat \[-d\] \[-n\] \[delay \[ count\]\]
> vmstat \[-p disk partition\] \[-n\] \[delay \[ count\]\]
> vmstat \[-f\]
> vmstat \[-V\]
> option:
> * -a:顯示活躍和非活躍內存
>* -f:顯示從系統啟動至今的fork數量 。
>* -m:顯示slabinfo
>* -n:只在開始時顯示一次各字段名稱。
>* -s:顯示內存相關統計信息及多種系統活動數量。
>* delay:刷新時間間隔。如果不指定,只顯示一條結果。
>* count:刷新次數。如果不指定刷新次數,但指定了刷新時間間隔,這時刷新次數為無窮。
>* -d:顯示磁盤相關統計信息。
>* -p:顯示指定磁盤分區統計信息
>* -S:使用指定單位顯示。參數有 k 、K 、m 、M ,分別代表1000、1024、1000000、1048576字節(byte)。默認單位為K(1024 bytes)
>* -V:顯示vmstat版本信息。
# <span style="font-size:15px">4、清理緩存</span>
> 以下三種方法為臨時清理緩存,另外,可以使用``sync``命令來清理文件系統緩存,還會清理僵尸(zombie)對象和它們占用的內存。
> 要想永久釋放緩存,需要在/etc/sysctl.conf文件中配置:`vm.drop_caches=1/2/3`,然后執行`sysctl -p`生效即可
```
// 臨時釋放緩存
// 清理pagecache(頁面緩存)
[root@backup ~]# echo 1 > /proc/sys/vm/drop_caches???? 或者 # sysctl -w vm.drop_caches=1
// 清理dentries(目錄緩存)和inodes
[root@backup ~]# echo 2 > /proc/sys/vm/drop_caches???? 或者 # sysctl -w vm.drop_caches=2
// 清理pagecache、dentries和inodes
[root@backup ~]# echo 3 > /proc/sys/vm/drop_caches???? 或者 # sysctl -w vm.drop_caches=3
```
此時如果在執行這些操作時正在寫數據,那么這些數據在寫入磁盤之前就會從文件緩存中清除。
解決這個問題,可以通過編輯`/proc/sys/vm/vfs_cache_pressure`這個文件的默認值來實現。
`/proc/sys/vm/vfs_cache_pressure`文件,告訴內核,當清理`inoe/dentry`緩存時應該用什么樣的優先級。默認值100,用于控制回收cache頻率,值越小則越傾向于保留cache,0表示從不回收cache容易導致out-of-memory
> 注:cache用于緩存inode/dentry,而buffer用于緩存data
```
[root@izwz91quxhnlkan8kjak5hz ~]# cat /proc/sys/vm/vfs_cache_pressure
100
```
- PHP
- PHP基礎
- PHP介紹
- 如何理解PHP是弱類型語言
- 超全局變量
- $_SERVER詳解
- 字符串處理函數
- 常用數組函數
- 文件處理函數
- 常用時間函數
- 日歷函數
- 常用url處理函數
- 易混淆函數區別(面試題常見)
- 時間戳
- PHP進階
- PSR規范
- RESTFUL規范
- 面向對象
- 三大基本特征和五大基本原則
- 訪問權限
- static關鍵字
- static關鍵字
- 靜態變量與普通變量
- 靜態方法與普通方法
- const關鍵字
- final關鍵字
- abstract關鍵字
- self、$this、parent::關鍵字
- 接口(interface)
- trait關鍵字
- instanceof關鍵字
- 魔術方法
- 構造函數和析構函數
- 私有屬性的設置獲取
- __toString()方法
- __clone()方法
- __call()方法
- 類的自動加載
- 設計模式詳解
- 關于設計模式的一些建議
- 工廠模式
- 簡單工廠模式
- 工廠方法模式
- 抽象工廠模式
- 區別和適用范圍
- 策略模式
- 單例模式
- HTTP
- 定義
- 特點
- 工作過程
- request
- response
- HTTP狀態碼
- URL
- GET和POST的區別
- HTTPS
- session與cookie
- 排序算法
- 冒泡排序算法
- 二分查找算法
- 直接插入排序算法
- 希爾排序算法
- 選擇排序算法
- 快速排序算法
- 循環算法
- 遞歸與尾遞歸
- 迭代
- 日期相關的類
- DateTimeInterface接口
- DateTime類
- DateTimeImmutable類
- DateInterval類
- DateTimeZone類
- DatePeriod類
- format參數格式
- DateInterval的format格式化參數
- 預定義接口
- ArrayAccess(數組式訪問)接口
- Serializable (序列化)接口
- Traversable(遍歷)接口
- Closure類
- Iterator(迭代器)接口
- IteratorAggregate(聚合迭代器) 接口
- Generator (生成器)接口
- composer
- composer安裝與使用
- python
- python3執行tarfile解壓文件報錯:tarfile.ReadError:file could not be opened successfully
- golang
- 單元測試
- 單元測試框架
- Golang內置testing包
- GoConvey庫
- testify庫
- 打樁與mock
- GoMock框架
- Gomonkey框架
- HTTP Mock
- httpMock
- mux庫/httptest
- 數據庫
- MYSQL
- SQL語言的分類
- 事務(重點)
- 索引
- 存儲過程
- 觸發器
- 視圖
- 導入導出數據庫
- 優化mysql數據庫的方法
- MyISAM與InnoDB區別
- 外連接、內連接的區別
- 物理文件結構
- PostgreSQL
- 編譯安裝
- pgsql常用命令
- pgsql應用目錄(bin目錄)文件結構解析
- pg_ctl
- initdb
- psql
- clusterdb
- cluster命令
- createdb
- dropdb
- createuser
- dropuser
- pg_config
- pg_controldata
- pg_checksums
- pgbench
- pg_basebackup
- pg_dump
- pg_dumpall
- pg_isready
- pg_receivewal
- pg_recvlogical
- pg_resetwal
- pg_restore
- pg_rewind
- pg_test_fsync
- pg_test_timing
- pg_upgrade
- pg_verifybackup
- pg_archivecleanup
- pg_waldump
- postgres
- reindexdb
- vacuumdb
- ecpg
- pgsql數據目錄文件結構解析
- pgsql數據目錄文件結構解析
- postgresql.conf解析
- pgsql系統配置參數說明
- pgsql索引類型
- 四種索引類型解析
- 索引之ctid解析
- 索引相關操作
- pgsql函數解析
- pgsql系統函數解析
- pgsql窗口函數解析
- pgsql聚合函數解析
- pgsql系統表解析
- pg_stat_all_indexes
- pg_stat_all_tables
- pg_statio_all_indexes
- pg_statio_all_tables
- pg_stat_database
- pg_stat_statements
- pg_extension
- pg_available_extensions
- pg_available_extension_versions
- pgsql基本原理
- 進程和內存結構
- 存儲結構
- 數據文件的內部結構
- 垃圾回收機制VACUUM
- 事務日志WAL
- 并發控制
- 介紹
- 事務ID-txid
- 元組結構-Tuple Structure
- 事務狀態記錄-Commit Log (clog)
- 事務快照-Transaction Snapshot
- 事務快照實例
- 事務隔離
- 事務隔離級別
- 讀已提交-Read committed
- 可重復讀-Repeatable read
- 可序列化-Serializable
- 讀未提交-Read uncommitted
- 鎖機制
- 擴展機制解析
- 擴展的定義
- 擴展的安裝方式
- 自定義創建擴展
- 擴展的管理
- 擴展使用實例
- 在pgsql中使用last、first聚合函數
- pgsql模糊查詢不走索引的解決方案
- pgsql的pg_trgm擴展解析與驗證
- 高可用
- LNMP
- LNMP環境搭建
- 一鍵安裝包
- 搭建方法
- 配置文件目錄
- 服務器管理系統
- 寶塔(Linux)
- 安裝與使用
- 開放API
- 自定義apache日志
- 一鍵安裝包LNMP1.5
- LNMP1.5:添加、刪除站點
- LNMP1.5:php多版本切換
- LNMP1.5 部署 thinkphp項目
- Operation not permitted解決方法
- Nginx
- Nginx的產生
- 正向代理和反向代理
- 負載均衡
- Linux常用命令
- 目錄與文件相關命令
- 目錄操作命令
- 文件編輯命令
- 文件查看命令
- 文件查找命令
- 文件權限命令
- 文件上傳下載命令
- 用戶和群組相關命令
- 用戶與用戶組的關系
- 用戶相關的系統配置文件
- 用戶相關命令
- 用戶組相關命令
- 壓縮與解壓相關命令
- .zip格式
- .tar.gz格式
- .gz格式
- .bz2格式
- 查看系統版本
- cpuinfo詳解
- meminfo詳解
- getconf獲取系統信息
- 磁盤空間相關命令
- 查看系統負載情況
- 系統環境變量
- 網絡相關命令
- ip命令詳解
- ip命令格式詳解
- ip address命令詳解
- ip link命令詳解
- ip rule命令詳解
- ip route命令詳解
- nslookup命令詳解
- traceroute命令詳解
- netstat命令詳解
- route命令詳解
- tcpdump命令詳解
- 系統進程相關命令
- ps命令詳解
- pstree命令詳解
- kill命令詳解
- 守護進程-supervisord
- 性能監控相關命令
- top命令詳解
- iostat命令詳解
- pidstat命令詳解
- iotop命令詳解
- mpstat命令詳解
- vmstat命令詳解
- ifstat命令詳解
- sar命令詳解
- iftop命令詳解
- 定時任務相關命令
- ssh登錄遠程主機
- ssh口令登錄
- ssh公鑰登錄
- ssh帶密碼登錄
- ssh端口映射
- ssh配置文件
- ssh安全設置
- 歷史紀錄
- history命令詳解
- linux開啟操作日志記錄
- 拓展
- git
- git初始化本地倉庫-https
- git初始化倉庫-ssh
- git-查看和設置config配置
- docker
- 概念
- docker原理
- docker鏡像原理
- docker Overlay2 文件系統原理
- docker日志原理
- docker日志驅動
- docker容器日志管理
- 原理論證
- 驗證容器的啟動是作為Docker Daemon的子進程
- 驗證syslog類型日志驅動
- 驗證journald類型日志驅動
- 驗證local類型日志驅動
- 修改容器的hostname
- 修改容器的hosts
- 驗證聯合掛載技術
- 驗證啟動多個容器對于磁盤的占用情況
- 驗證寫時復制原理
- 驗證docker內容尋址原理
- docker存儲目錄
- /var/lib/docker目錄
- image目錄
- overlay2目錄
- 數據卷
- 具名掛載和匿名掛載
- 數據卷容器
- Dockerfile詳解
- dockerfile指令詳解
- 實例:構造centos
- 實例:CMD和ENTRYPOINT的區別
- docker網絡詳解
- docker-compose
- 緩存
- redis
- redis的數據類型和應用場景
- redis持久化
- RDB持久化
- AOF持久化
- redis緩存穿透、緩存擊穿、緩存雪崩
- 常見網絡攻擊類型
- CSRF攻擊
- XSS攻擊
- SQL注入
- Cookie攻擊
- 歷史項目經驗
- 圖片上傳項目實例
- 原生php上傳方法實例
- base64圖片流
- tp5的上傳方法封裝實例
- 多級關系的遞歸查詢
- 數組轉樹結構
- thinkphp5.1+ajax實現導出Excel
- JS 刪除數組的某一項
- 判斷是否為索引數組
- ip操作