我的内存都去哪里了?| 美创运维日记

哎呀,我们来谈谈Linux系统上的内存吧。
服务器总内存为6 2 GB,可用内存据说只有1 GB。
但看看总共 5 5 GB 的缓存。
该缓存被大量使用。
其实,这是正常的。
在设计Linux系统时主要考虑到这一点,以提高读写文件的效率。

首先,我们来谈谈缓存。
这个缓存在Linux中称为Pagecache,主要用于缓存文件系统中的文件数据。
例如,当读取或写入文件时,这部分数据会被缓存。
这样,下次访问该文件时,系统可以直接从内存中读取它,而不必到硬盘上查找。
这可以做得更快吗?
我们来谈谈缓冲区。
这个缓冲区称为Buffercache,主要用于缓存块设备上的数据。
例如,当读取或写入硬盘时,数据首先存储在缓冲区中。
这样也可以减少直接访问硬盘的次数,提高效率。

Linux系统非常聪明,会自动回收这些缓存。
当内存不足时,系统开始回收内存,释放缓存空间并将其分配给需要它的进程。
但是,有时您可能需要手动清除缓存。
此时可以使用sync命令同步数据,然后通过写入echo 3 > /proc/sys/vm/drop_caches来清除缓存。

但说实话,我从来没有看到手动清除缓存的理由。
后来我发现这个缓存是为了提高效率。
清除此项会增加 I/O 使用率并影响业务效率。
因此,一般不建议手动清除缓存,除非遇到内存压力很大的情况。

总之,缓存使用率高是正常现象,但不要轻易清除。
归根结底,这都是为了提高效率。

linux 查看cpu核数、内存总容量、硬盘总容量

兄弟,我以前在 Linux 中做过这个,它真的很有帮助。
我记得有一次我帮朋友的公司维护一台服务器。
当时我在那台服务器上使用这些命令来检查CPU核心数、内存和硬盘容量。

CPU核心数,我使用命令cat /proc/cpuinfo|grep'processor'|sort|uniq|wc。
当我看到输出时,我感到非常惊讶。
该服务器有2 4 个CPU核心,非常强大。
当时我就想,这么多核心,处理起来应该很快。

内存容量,我用cat/proc/meminfo|grep"MemTotal"|awk'{print$2 /1 02 4 /1 02 4 }'。
这次我看到的结果是2 5 6 GB,这是相当大的内存了。
这家公司处理的数据量似乎非常大。

硬盘容量,我尝试了命令 df -h 和 fdisk -l。
当df -h命令退出时,看到硬盘总容量为2 TB,完全满了。
然后我使用fdisk -l命令检查分区状态,发现很多分区都快满了,需要快速清理。

不过话说回来,使用 fdisk 命令时需要小心。
如果不小心,可能会导致数据丢失。
之前看到一位同事不小心把整个硬盘格式化了,真是痛苦了好久。

嗨,说到这些命令,它们确实是Linux系统管理员的好帮手。
不过兄弟,如果你是第一次处理这些事情,还是要小心,别把命令顺序或者参数搞错了,那就尴尬了。

Linux共享内存的管理方法

哈,Linux共享内存确实很复杂,但是一旦理解了,就很容易使用了。
上周,一位客户问我为什么要写一个小程序来使用共享内存。
结果程序运行后内存仍然满了并且没有释放,导致系统资源被耗尽。
当时我就帮他做了这些手术。

看,要创建共享内存段,您必须使用 shmget。
例如,2 02 3 年6 月我在杭州编写测试代码时,创建了一个1 KB的内存段。
代码写成如下: C int shmid = shmget(IPC_PRIVATE, 1 02 4 , IPC_CREAT | 06 6 6 );
这个IPC_PRIVATE让系统自己密钥,所以不用担心。
如果要使用某个密钥,则需要检查/etc/ipc/shm.id文件,看看它是否被使用。
size是内存大小,06 6 6 是允许的,这个数字全世界都用,rw-rw-rw-。

内存已创建,如何使用?您必须使用 shmat 将其挂在进程的地址空间中。
比如我的测试程序中,挂载成功后,ptr指针指向共享内存: C void ptr = shmat(shmid, NULL, 0);
此时ptr就像操作普通内存一样写入和读取数据。
当我写测试的时候,我写了“你好,共享内存!”直接,然后使用shmdt卸载: C sprintf(ptr, "你好,共享内存!"); shmdt(ptr);
注意卸载后,内存并不会立即消失,而是进程不可见。

但是问题来了,如果多个进程会发生什么想分享一段回忆吗?这取决于IPCS-M的输出。
2 02 3 年8 月我在深圳调试多进程项目时,发现natch字段非常重要。
如果 natch 为 0,则表示没有进程正在使用它;如果它大于 0,则意味着正在执行某些进程来安装它。

想要删除记忆吗?为此,需要使用 ipcrm 或 shmctl。
如果确定没有进程在使用它,则直接删除它: 巴什 ipcrm -m
但是如果还有进程挂着,直接删除就会报错。
这时需要使用shmctl设置ipc_rmid来将内存标记为已删除(ipcs -m会显示status:destination)。
然后,您必须等待所有进程完成,系统才能真正回收资源。
我在深圳调试的时候,遇到了最尴尬的情况。
忘记了守护进程 shmdt。
结果我一次又一次的删除,记忆却就是不肯消失。
最后发现守护进程卡在那里。
这真的很烦人。

最烦人的事是什么?我告诉你,这些权限和资源都被泄露了。
权限设置不正确。
例如,如果其他用户具有写入权限,则该进程也无法读取。
2 02 3 年 5 月,我在上海帮助客户解决问题时,程序无法读取共享内存。
原来,另一个程序创建时使用06 00权限,组用户没有读取权限。
只要改回来就可以了。

资源泄露更可耻。
如果没有调用shmdt,或者没有在IPC_RMID上调用shmctl,那么这块内存将被永远占用。
我见过的最夸张的事情是,一个老项目的代码太糟糕了,内存段堆积起来,几乎让系统崩溃。
后来我们花了整整一个星期的时间写脚本,一一运行ipcs -m和ipcrm -m来清理。
所以现在写程序的时候,记得在退出之前清理一下共享内存,养成良好的习惯。

调试怎么样? lsof -p 可以查看哪个进程占用了共享内存。
如果程序卡在shmat或shmdt上,strace是个好东西。
2 02 3 年9 月,我在成都帮同事排查问题时,一个流程陷入了僵局。
当我查看strace时,发现请求的内存key是错误的。
不调试的话我还真不知道这么详细的问题。

无论如何,这取决于你。
如果使用得当,共享内存是一个神器,但如果使用不当,它就是一个炸弹。
多做测试,多注意权限和清理,通常不会有什么大问题。

Linux虚拟内存,你理解到位了?

Linux虚拟内存的核心是隔离进程内存。

分页机制将4 KB的物理内存切成小块。

页表将虚拟页转换为物理页。

错误分页符解决了卸载的页面。

SWAP 将未使用的页面存储在硬盘驱动器上。

频繁更换会降低系统速度。

进程内存管理不怕碎片。

权限位控制读写执行。

库文件被多个进程使用。

共享存储是使用shmget 创建的。

虚拟地址空间 3 2 位 3 GB。

SWAP使用硬盘来扩展内存。

3 2 位系统物理内存4 GB。

6 4 位系统最高支持 2 5 6 TB。

使用/dev/mem直接提供内存。

JVM使用Glibc池来分配内存。

关注RES栏,查看实际入住情况。

free -h 查看总内存。

vmstat1 监视内存状态。

pmap-x 分析进程内存。

echo0>来自 SWAP 的交换性。

自己掂量一下。