第6章:计算机内存实战
Linux内存扩容,swap配置实战
swap 配置参数:swappiness
- 参数可以从 0 - 100 进行设置,默认值
swappiness=60
,表示内存使用率超过100 - 60 = 40%
时开始使用交换分区。 swappiness=0
的时候表示最大限度使用物理内存,尽量不用 swap 空间,有些服务器厂商直接设置为 0:
- 注意:把
swappiness
设置成 0 不会禁止 swap,是最大限度不用,不是一定不用,想要禁止,就不要开启 swap。
- 注意:把
swappiness=100
的时候表示积极的使用 swap 分区,把内存上的数据及时的搬运到 swap 空间。- 命令:
- 查看:
cat /proc/sys/vm/swappiness
。 - 临时修改:
echo 10 > /proc/sys/vm/swappiness
。 - 永久调整:
cat /etc/sysctl.conf
加上,vm.swappiness=10
。
- 查看:
查看是否有开启 swap:free -m
,如果没 0,则说明没开启。
Linux 支持两种类型的 Swap:Swap 分区和 Swap 文件(我们实战使用文件方式)。
命令:
- dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换,下面是参数:
if = 文件名
:输入文件名,缺省为标准输入,即指定源文件。< if = input file >
of = 文件名
:输出文件名,缺省为标准输出,即指定目的文件。< of = output file >
bs = bytes
:同时设置读入 / 输出的块大小为 bytes 个字节。count = blocks
:仅拷贝 blocks 个块,块大小等于指定的字节数。
- 例子:
- 增加 swap 分区文件大小(创建一个大小为 256M 的文件,256 * 1024kb = 262144)
dd if=/dev/zero of=/swapfile bs=1024 count=262144
#/dev/zero是一个输入设备,用它来初始化文件。
- 把创建的文件变成 swap 文件
mkswap /swapfile
- 启用这个 swap 文件
swapon /swapfile
- (可选)编辑 /etc/fstab 文件,末行添加下面命令,每次开机时自动加载 swap 文件
vim /etc/fstab
/swapfile swap swap default 0 0
- (可选)如果不需要了,可以也可以卸载
sudo swapoff /swapfile
- (可选)查看 swap 文件位置
swapon -s
- 查看
free -m
Linux的free命令
free 命令(宏观命令 mpstat \ vm)
- 显示 Linux 系统中空闲的、已用的物理内存、swap 内存 和 被内核使用的 buffer。
- 格式:
free [参数]
参数 | 说明 |
-b | Byte 为单位显示内存使用情况 |
-k | KB 为单位显示内存使用情况 |
-m | MB 为单位显示内存使用情况 |
-g | GB 为单位显示内存使用情况 |
-h | 自动化更好的可读性方式显示 |
-w | 将 buffer 和 cache 拆分单独的两个列显示 |
-s <间隔秒数> | 持续观察内存使用状况,比如每隔两秒显示一次 |
-t | 显示内存总和列,比如 |
显示结果说明
数值 | 解释 |
total | 总计物理内存 + Swap 的大小 |
used | 已使用物理内存 + Swap 的大小 |
free | 可用的物理内存 + Swap 的大小 |
shared | 被共享使用的物理内存大小 |
buff/cache | 磁盘的缓冲和缓存大小,buffers 是块设备做的缓冲大小,cached 是给文件做缓存大小 |
available | 可以被程序使用的内存大小 |
疑虑点:有一个free
列,还有一个available
列,这二者到底有何区别?
free
是真正未被使用的物理内存数量。available
是应用程序的角度看到的可用内存数量:
- Linux 为了提升读写性能,会消耗一部分内存资源缓存磁盘数据,就是
buffer
和cache
。 - 没有足够的
free
内存可用,内核就会从buffer
和cache
中回收内存。
- Linux 为了提升读写性能,会消耗一部分内存资源缓存磁盘数据,就是
- 大概计算:
available = free + buff/cache
。total = used + free + buff/cache
。
Linux的top命令详解
- top 命令(全拼 + 局部)
- 能够实时显示系统中各个进程的资源占用状况,包括进程 ID、内存占用率、CPU 占用率等。
- 格式是
top [参数]
,按1
后显示各个 CPU 明细情况。
[root@iZwz9eguu9udh3t4kruz8 ~]# top
# 任务队列信息,CPU 1 5 15分钟负载
top - 20:24:16 up 22 days, 3:04, 2 users, load average: 0.19, 0.27, 0.23# 任务进程信息 total 总进程数, running运行着进程数, sleeping睡眠进程数, stopped停止进程数, zombie僵尸进程数
Tasks: 206 total, 1 running, 184 sleeping, 21 stopped, 0 zombie# us用户态占用cpu的百分比, sy内核态占用CPU的百分比, id —空闲CPU百分比
# wa等待IO占用CPU的百分比, hi硬中断(hardware IRQ)占用CPU的百分比, si软中断(software Interrupts)占用CPU百分比
%Cpu0 : 0.3 us, 0.3 sy, 0.0 ni, 99.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 0.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st# 内存状态 total物理内存总量, free空闲内存总量, used使用中的内存总量, buff/cache缓存的内存量
KiB Mem : 3782388 total, 126176 free, 2638680 used, 1017532 buff/cache# swap交换分区信息 total交换区总量, free空闲交换区总量, used使用的交换区总量, avail mem进程可用内存空间
KiB Swap: 0 total, 0 free, 0 used. 845604 avail Mem # 进程的状态信息 PID 进程Id, USER进程所有者, PR进程优先级 动态优先级;NI nice负值表示高优先级,静态优先级一般不变
# VIRT 进程使用的虚拟内存总量 VIRT=SWAP+RES, 申请过的内存没有真正分配的物理内存也会计算在内, 进程的虚拟内存往往比内存大得多
# RES 进程实际使用的、未被换出的物理内存大小, 即不包括Swap和共享内存, 单位kb
# %SHR 共享内存大小, 单位kb# S进程状态, D=不可中断的睡眠状态 R=运行 S=睡眠 T=停止 Z=僵尸进程;%CPU上次更新到现在的CPU时间占用百分比
# %MEM 进程使用的物理内存百分比;TIME+ 进程使用的CPU总时间, 单位1/100秒;COMMAND 进程名称(命令名/命令行)PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4848 root 20 0 4032844 505308 10956 S 10.3 13.4 107:16.76 java 9858 root 20 0 1053996 135216 13384 S 3.0 3.6 398:12.68 YDService 9 root 20 0 0 0 0 S 0.7 0.0 43:19.53 rcu_sched 1241 polkitd 20 0 154240 4732 764 S 0.7 0.1 66:55.08 redis-server 7308 root 20 0 1806540 20352 2540 S 0.7 0.5 416:41.24 barad_agent
23139 polkitd 20 0 133504 8292 1748 S 0.7 0.2 3:30.94 redis-server
25204 root 20 0 1236448 6080 3132 S 0.7 0.2 10:37.04 containerd-shim
25225 polkitd 20 0 55436 3828 1552 S 0.7 0.1 20:28.27 redis-server 4488 polkitd 20 0 2504208 370440 2376 S 0.3 9.8 116:03.67 mysqld 5763 root 20 0 1578968 28692 4936 S 0.3 0.8 57:32.83 containerd
16228 polkitd 20 0 2866608 390852 14304 S 0.3 10.3 5:45.31 mysqld
32175 root 20 0 1236448 6896 3292 S 0.3 0.2 23:24.07 containerd-shim
32197 polkitd 20 0 2769316 394148 3524 S 0.3 10.4 93:43.22 mysqld 1 root 20 0 43768 3564 2028 S 0.0 0.1 10:38.98 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.72 kthreadd