在Linux系统中,共享内存是进程间通信(IPC)的重要方式之一,通过系统命令,管理员可以查看共享内存的分配状态、使用情况及资源细节,以下是详细的操作指南:
核心命令:ipcs
ipcs
(IPC Status)是查看共享内存的核心工具,提供三类IPC资源信息:
ipcs -m # 专查共享内存(-m: shared memory)
输出解析:
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 65536 user 600 4096 2 dest
0x0000abcd 98305 mysql 660 1024000 4
- key:共享内存唯一标识(
0x0
表示私有) - shmid:共享内存ID(操作时使用)
- bytes:内存段大小(字节)
- nattch:当前附加进程数
- status:
dest
表示段标记为删除(进程分离后销毁)
常用组合命令:
ipcs -m -l # 查看系统共享内存限制(max size, max segments等) ipcs -m -c # 显示创建者信息 ipcs -m -t # 输出最后操作时间
查看实时使用情况
top
/ htop
动态监控
运行top
后按M
(大写)按内存排序,共享内存占用计入进程的RES
(常驻内存):
PID USER RES SHR %MEM COMMAND
1234 mysql 1.2g 900m 15.3 mysqld
- SHR:共享内存+其他共享资源(如动态库)
free
查看系统内存分布
free -m
输出中的shared
行显示所有共享内存总量:
total used free shared buff/cache available
Mem: 7982 2100 3200 845 2682 4521
进阶工具与技巧
按进程查看共享内存映射
# 通过进程ID查看映射的共享内存段 pmap -x 1234 | grep shm # 示例输出: 00007f3d4aa00000 10240K rw-s- shmid=0x98305 (deleted)
shmid
后显示共享内存ID,deleted
表示已标记删除但仍有进程使用
统计共享内存总量
ipcs -m | awk '$5 ~ /^[0-9]+$/ {sum+=$5} END {print "Total Shared Memory:", sum/1024/1024, "GB"}'
图形化工具
nmon
:运行nmon
后按m
查看内存详情(含共享内存)gnome-system-monitor
:GUI工具中“资源”选项卡可查看共享内存
清理共享内存(谨慎操作)
⚠️ 操作需root权限,误删可能导致进程崩溃
# 删除指定ID的共享内存段 ipcrm -m 98305
删除所有无人使用的共享内存
ipcs -m | awk ‘/0 0/ {print $2}’ | xargs -I{} ipcrm -m {}
---
### **五、常见问题排查**
1. **`ipcs`无输出?**
- 可能无共享内存分配,或权限不足(尝试`sudo ipcs -m`)
2. **共享内存无法释放?**
- 检查`nattch`(附加进程数):若 >0 表示仍有进程占用
- 检查`status`:`dest`状态需等待进程分离
3. **`Cannot allocate memory`错误?**
- 检查系统限制:`cat /proc/sys/kernel/shmmax`(单个段最大值)
- 调整限制(临时):`sysctl -w kernel.shmmax=2147483648`
---
### **注意事项**
- **生产环境操作前备份数据**,删除共享内存可能导致进程异常
- 共享内存大小受`/proc/sys/kernel/shmmax`和`shmall`限制
- 数据库(如MySQL、Oracle)及缓存服务(Redis)是共享内存的常见使用者
基于Linux内核文档([kernel.org](https://www.kernel.org/doc/html/latest/admin-guide/sysctl/kernel.html))及`man`手册(`man ipcs`, `man shm_overview`),结合系统管理实践整理,命令适用于主流Linux发行版(CentOS, Ubuntu等)。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/19511.html