[内容] Linux 内存机制

内容一:Linux 显示内存的命令

# free -m

内容二:Linux 内存机制

1) total 内存的总大小
2) used 正在被使用的内存大小
3) free 表示完全没有被使用的物理内存大小
4) shared 正在被多个进程共享的内存大小
5) buffers 被内核用作统缓冲区 (buffers) 的大小。这些数据暂时存储在内存中,用于提升系统性能,当再次使用时可以在内存中被快速调用。buffers (buffer page) 代表块设备 (硬盘等设备) 所占用的缓存页,对应从硬盘中直接获取的数据,处于内存和硬盘之间,由内核使用 (当 free 状态的内存不够时,它的部分空间会自动释放出来,我们也可以手动释放出它的部分空间来)
6) cached 被内核用作文件系统缓存 (cache) 的大小。这些数据暂时存储在内存中,用于提升系统性能,当再此使用时可以在内存中被快速调用。cached (cache page) 代表普通文件数据 (硬盘里的数据) 所占用的缓存页,对应 vfs 页缓冲层的数据,处于内存和 CPU (处理器) 之间,由应用程序使用 (当 free 状态的内存不够时,它的部分空间会自动释放出来,我们也可以手动释放出它的部分空间来)
7) available = free + buffers (部分空间) + cached (部分空间),也就是估算出来的真实的内存可使用量


补充:释放处于 buffers 和 cached 状态内存的方法

1) 释放 page cache:

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

2) 释放 dentries 和 inodes:

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

3) 同时释放 pagecache、dentries 和 inodes:

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

内容三: Linux Swap 内存的使用机制

3.1 Linux 内存的种类

1) Linux 物理内存:系统的真实内存,速度快 (也就是 free 命令中显示的第 1 行)
2) Linux Swap 内存:使用硬盘作为临时的内存的空间,速度慢 (也就是 free 命令中显示的第 2 行)

3.2 Swap 内存被使用的条件

1) Linux 内核会周期性把内存中不常调用的匿名页和共享内存交换至 Swap 内存里。即使现在 Linux 系统的物理内存有剩余空间
2) 当系统的内存不足时,系统会把匿名页和共享内存交换至 Swap 内存里

内容四:查看那些内存可以交换至 Swap 内存以及哪些内存可以被释放

# cat /proc/meminfo 
MemTotal:       65185544 kB
MemFree:        42285372 kB
MemAvailable:   57893528 kB
Buffers:            1656 kB
Cached:         16157600 kB
SwapCached:            0 kB
Active:          4505604 kB
Inactive:       17856228 kB
Active(anon):    1859740 kB
Inactive(anon):  4353236 kB
Active(file):    2645864 kB
Inactive(file): 13502992 kB
Unevictable:          16 kB
Mlocked:              16 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Zswap:                 0 kB
Zswapped:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:       6190160 kB
Mapped:           130544 kB
Shmem:             10400 kB
KReclaimable:     100636 kB
Slab:             234788 kB
SReclaimable:     100636 kB
SUnreclaim:       134152 kB
KernelStack:        8096 kB
PageTables:        26504 kB
SecPageTables:       696 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    32592772 kB
Committed_AS:   13920568 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       58476 kB
VmallocChunk:          0 kB
Percpu:            14464 kB
HardwareCorrupted:     0 kB
AnonHugePages:   5797888 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
FileHugePages:         0 kB
FilePmdMapped:         0 kB
CmaTotal:              0 kB
CmaFree:               0 kB
Unaccepted:            0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      284800 kB
DirectMap2M:    14784512 kB
DirectMap1G:    51380224 kB


补充:
1) Active(anon) 经常被使用的内存
2) Inactive(anon) 没有被经常使用的内存,也是 Linux 系统可以从物理内存交换至交换分区里的内存
3) Active(file) 经常被使用的页缓存内存
4) Inactive(file) 没有被经常使用的页缓存内存,也是 buffers/cached 中可以被系统回收的内存

[步骤] Linux 切换用户时图形变量的保持

步骤一:显示当前用户的图形变量

$ echo $DISPLAY
localhost:10.0

(补充:这里的图形变量参数是 localhost:10.0)

步骤二:切换到其他用户

$ su - root

(补充:这里以切换到 root 用户为例)

步骤三:使用上一个用户的图形变量

# export DISPLAY=localhost:10.0

(补充:这里以将图像变量设置为刚才看到的 localhost:10.0 为例)

步骤四:使用图形程序

# xclock

(补充:这里以使用 xclock 图形程序为例)

[命令] Linux 命令 route (管理临时路由表)

案例一:添加某 1 个 IP 地址的路由表

# route add -host 192.168.2.1 dev eth0 gw 192.168.1.1

(补充:这里以指向 192.168.2.1 IP 地址的流量需要通过 eth0 网卡和 192.168.1.1 网关 IP 地址为例)

案例二:删除某 1 个 IP 地址的路由表

2.1 删除某 1 个 IP 地址的路由表

# route del -host 192.168.2.1

(补充:这里删除 192.168.2.1 IP 地址的路由表为例)

2.2 删除某 1 个 IP 地址且指定网关和网卡的路由表

# route del -host 192.168.2.1 -gateway dev eth0 192.168.1.1

(补充:这里以删除指向 192.168.2.1 IP 地址的流量需要通过 eth0 网卡和 192.168.1.1 网关 IP 地址的路由为例)

案例三:添加某 1 个网段的路由表

# route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.1.1

(补充:这里以指向 192.168.2.0/24 网段的流量需要通过 192.168.1.1 网关 IP 地址为例)

案例四:删除某 1 个网段的路由表

4.1 删除某 1 个网段的路由表

# route del -net 192.168.2.0/24

(补充:这里删除 192.168.2.0/24 网段的路由表为例)

4.2 删除某 1 个 IP 地址且指定网关的路由表

# route del -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.1.1

(补充:这里以删除指向 192.168.2.0/24 网段的流量需要通过 192.168.1.1 网关 IP 地址的路由表为例)

案例五:显示现有的路由表

# route -n