Linux 查看内存使用
Linux 查看内存使用
服务器内存不够用的时候,得知道谁在吃内存。
1. free 命令
最常用的查看内存命令:
free -h
输出说明:
- total: 总内存
- used: 已用内存
- free: 空闲内存
- shared: 共享内存
- buff/cache: 缓存
- available: 可用内存
注意: 不要只看 free,要看 available。Linux 会用空闲内存做缓存,这是好事。
2. top 命令
实时查看内存占用:
top
常用操作:
- 按
M按内存排序 - 按
P按CPU排序 - 按
q退出
重点看:
- %MEM:进程内存占用百分比
- RES:进程实际占用物理内存
3. ps 命令
查看进程内存占用:
# 按内存占用排序,前10
ps aux --sort=-%mem | head -10
输出说明:
- USER:进程用户
- %MEM:内存占用
- RSS:实际物理内存(KB)
- COMMAND:进程命令
4. vmstat 命令
查看整体内存和CPU:
# 每秒刷新一次
vmstat 1
重点列:
- swpd:交换分区使用
- free:空闲内存
- buff:缓冲区
- cache:缓存
- si:换入内存
- so:换出内存
注意: si 和 so 大于0说明内存不够,在用swap。
5. /proc/meminfo
查看详细内存信息:
cat /proc/meminfo
重点看:
- MemTotal:总内存
- MemFree:空闲内存
- MemAvailable:可用内存
- Buffers:缓冲区
- Cached:缓存
- SwapTotal:交换分区总量
- SwapFree:交换分区空闲
6. 缓存说明
Linux 内存缓存机制:
- 空闲内存用来做文件缓存
- 程序需要时会自动释放
- cached 高不是坏事
- available 才是真正可用的
7. 内存不够怎么办
1)找出吃内存的进程
ps aux --sort=-%mem | head
2)重启大内存进程
- 确认是哪个进程
- 重启释放内存
3)清理缓存
# 清理页面缓存
echo 1 > /proc/sys/vm/drop_caches
# 清理目录项和inode
echo 2 > /proc/sys/vm/drop_caches
# 全部清理
echo 3 > /proc/sys/vm/drop_caches
4)加交换分区
- 临时方案,治标不治本
- 最好加物理内存
8. 常用组合命令
# 查看内存占用前5的进程
ps aux --sort=-%mem | head -6
# 查看swap使用最多的进程
for i in $(ls /proc | grep -E '^[0-9]+'); do
awk '/VmSwap/{print $2/1024 " MB", $0}' /proc/$i/status 2>/dev/null
done | sort -nr | head
9. 监控建议
1)设置内存告警
- 超过80%告警
- 及时处理
2)定期检查
- 每天看一次内存
- 发现异常及时处理
3)不要盲目清缓存
- 缓存是好事
- 清缓存会降低性能
总结
Linux 查看内存使用要点:
- free -h 看整体内存
- top 按M看内存占用
- ps aux 排序找大进程
- vmstat 看swap使用
- /proc/meminfo 看详细信息
- 不要只看 free,要看 available
- cached 高是好事
- 内存不够先找大进程
- 清缓存要谨慎
- 最好加物理内存
学会看内存,服务器问题就好排查了。
Redis 过期策略详解
Redis 过期策略详解
Redis 设置了过期时间后,怎么删除过期的 key?这就涉及过期策略。
1. 设置过期时间
# 设置过期时间(秒)
set name "张三" ex 60
# 给已有key设置过期时间
expire name 60
# 查看剩余时间
ttl name
# 移除过期时间
persist name
2. 两种过期策略
1)惰性删除
- 等到访问这个 key 的时候才检查是否过期
- 过期了就删除,返回 nil
- 优点:对 CPU 友好
- 缺点:对内存不友好,很多过期 key 没被访问就占着内存
2)定期删除
- 每隔一段时间,随机检查一些 key
- 发现过期的就删除
- 优点:定期清理,控制内存
- 缺点:随机抽查可能漏
Redis 实际是两种策略结合用。
3. 内存淘汰策略
当内存满了,写入新数据时怎么办?
# 查看当前淘汰策略
config get maxmemory-policy
常用淘汰策略:
- noeviction: 不淘汰,写入报错(默认)
- allkeys-lru: 所有 key 中淘汰最久没用的
- allkeys-random: 所有 key 中随机淘汰
- volatile-lru: 只在设置了过期时间的 key 中淘汰最久没用的
- volatile-random: 只在设置了过期时间的 key 中随机淘汰
- volatile-ttl: 淘汰即将过期的 key
生产推荐:allkeys-lru
4. LRU 和 LFU
- LRU(最近最少使用): 淘汰最久没访问的
- LFU(最不经常使用): 淘汰访问次数最少的
Redis 4.0 开始支持 LFU。
5. 实际使用建议
-
设置合理的 maxmemory
- 不要让 Redis 把内存占满
- 一般设为服务器内存的 70%
-
选择合适的淘汰策略
- 纯缓存场景:allkeys-lru
- 有持久化数据:volatile-lru
-
key 一定要设过期时间
- 重要数据不要设过期
- 缓存数据都要设过期时间
-
监控内存使用
- 用 info memory 查看
- 关注 used_memory 指标
6. 查看内存信息
# 查看内存使用
info memory
# 查看key数量
dbsize
# 查看大key
--bigkeys
总结
Redis 过期策略要点:
- 惰性删除:访问时才删
- 定期删除:定期抽查清理
- 两种策略结合使用
- 内存满了要配置淘汰策略
- 生产推荐 allkeys-lru
- 缓存数据都要设过期时间
- 监控内存使用情况
搞懂过期策略,Redis 用起来才不踩坑。