linux概念之/dev/shm

本文深入探讨了Linux系统中 /dev/shm 分区的作用、配置方法及优化策略,包括其如何利用内存提升文件操作效率,以及如何通过调整大小和inode数量来满足不同场景的需求。同时,文章介绍了initramfs的概念及其在Linux启动过程中的作用,提供了如何通过mount命令管理和永久修改 /dev/shm 配置的详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux默认(CentOS)/dev/shm分区的大小是系统物理内存的50%, 虽说使用/dev/shm对文件操作的效率会高很多,
但是目前各发行软件中却很少有使用它的(除了前面提到的Oracle), 可以通过ls /dev/shm查看下面是否有文件, 如果没有就说明当前系统并没有使用该设备.

默认的Linux发行版中的内核配置都会开启tmpfs,映射到了/dev/下的shm目录。可以通过df 命令查看结果.
/dev/shm/是linux下一个非常有用的目录,因为这个目录不在硬盘上,而是在内存里。因此在linux下,就不需要大费周折去建ramdisk,直接使用/dev/shm/就可达到很好的优化效果。默认系统就会加载/dev/shm ,它就是所谓的tmpfs,有人说跟ramdisk(虚拟磁盘),但不一样。象虚拟磁盘一样,tmpfs 可以使用您的 RAM,但它也可以使用您的交换分区来存储。而且传统的虚拟磁盘是个块设备,并需要一个 mkfs 之类的命令才能真正地使用它,tmpfs 是一个文件系统,而不是块设备;您只是安装它,它就可以使用了。
tmpfs有以下优势:
1。动态文件系统的大小,/dev/shm/需要注意的一个是容量问题,在linux下,它默认最大为内存的一半大小,使用df -h命令可以看到。但它并不会真正的占用这块内存,如果/dev/shm/下没有任何文件,它占用的内存实际上就是0字节;如果它最大为1G,里头放有 100M文件,那剩余的900M仍然可为其它应用程序所使用,但它所占用的100M内存,是绝不会被系统回收重新划分的
2。tmpfs 的另一个主要的好处是它闪电般的速度。因为典型的 tmpfs 文件系统会完全驻留在 RAM 中,读写几乎可以是瞬间的。
3。tmpfs 数据在重新启动之后不会保留,因为虚拟内存本质上就是易失的。所以有必要做一些脚本做诸如加载,绑定的操作。

[root@oracle5A ~]# df -h
Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root   27G  5.3G   20G  22% /
tmpfs                         1.9G  650M  1.3G  34% /dev/shm

默认的最大一半内存大小在某些场合可能不够用,并且默认的inode数量很低一般都要调高些,这时可以用mount命令来管理它。
#mount -o size=1500M -o nr_inodes=1000000 -o noatime,nodiratime -o remount /dev/shm
在2G的机器上,将最大容量调到1.5G,并且inode数量调到1000000,这意味着大致可存入最多一百万个小文件。
如果需要永久修改/dev/shm的值,需要修改/etc/fstab
tmpfs /dev/shm tmpfs defaults,size=1.5G 0 0
mount -o remount /dev/shm

 

 

http://www.cnblogs.com/pied/archive/2013/01/29/2880718.html

http://www.landley.net/writing/

怎样使用initramfs

工作过程简述

在2.6kernel启动时,它把rootfs作为它的第一个文件系统挂载(注意:这里的rootfs是真名!!!不是root filesystem的缩写)。rootfs是一个特殊的tmpfs,这个不能被删除或者是unmounted。很多使用2.6内核的系统通常都是挂载 rootfs后什么都不做,然后启动另一个文件系统作为root filesystem。但是,这个不能掩盖rootfs存在的事实,你可以“cat /proc/mounts” 来查看,第一个挂载的肯定是rootfs。

[root@210-lvs grub]# cat /proc/mounts
rootfs / rootfs rw 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,seclabel,relatime 0 0
devtmpfs /dev devtmpfs rw,seclabel,relatime,size=241800k,nr_inodes=60450,mode=755 0 0
devpts /dev/pts devpts rw,seclabel,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs /dev/shm tmpfs rw,seclabel,relatime 0 0
/dev/mapper/VolGroup-lv_root / ext4 rw,seclabel,relatime,barrier=1,data=ordered 0 0
none /selinux selinuxfs rw,relatime 0 0
devtmpfs /dev devtmpfs rw,seclabel,relatime,size=241800k,nr_inodes=60450,mode=755 0 0
/proc/bus/usb /proc/bus/usb usbfs rw,relatime 0 0
/dev/sda1 /boot ext4 rw,seclabel,relatime,barrier=1,data=ordered 0 0
none /proc/sys/fs/binfmt_misc binfmt_misc rw,relatime 0 0

rootfs被挂载后,kernel立马就解压了那个用gzip压缩的CPIO归档文件到rootfs。每个2.6的内核都会执行这一步,但是默认 那个压缩档是空的,所以也就没有往rootfs内添加任何东西。接着kernel会尝试在rootfs去找寻/init,一旦找到init并执 行,kernel也就完成了启动工作,然后便是刚刚执行的init程序接管了接下来的工作。如果kernel没法调用"/init"程序,可能就会回过头 去,按照便准的做法去解析参数“root=”,试图找到另一个filesystem然后挂载它。

这里的使用initramfs是指,提供一个/init程序给rootfs使用,我们可以通过两种途径实现:使用编译进内核的cpio.gz档案, 或者是一个独立的cpio.gz档案。以前的initrd就是编译一个独立的档案,很多使用initramfs的方式也是给它提供一个独立的档案。

 

总结一下

这四种给rootfs提供内容的方式都有一个共同点:在kernel启动时,一系列的文件被解压到rootfs,如果kernel能在其中找到可执行的文件“/init”,kernel就会运行它;这意味着,kernel不会再去理会“root=”是指向哪里的。

此外,一旦initramfs里面的init 进程运行起来,kernel就会认为启动已经完成。接下来,init将掌控整个宇宙!它拥有霹雳无敌的专门为它预留的Process ID #1,整个系统接下来的所有都将由它来创造!还有,它的地位将是不可剥夺的,嗯哼,PID 1 退出的话,系统会panic的。

转载于:https://www.cnblogs.com/createyuan/p/4341349.html

<think>我们正在分析Linux系统的内存和tmpfs使用情况。根据用户提供的引用信息,我们可以了解到: - tmpfs是一种基于内存的文件系统,通常用于实现共享内存(如SYS V共享内存)和用户空间挂载点(如/dev/shm)[^1]。 - tmpfs占用的内存属于内核可回收内存的一部分,但当tmpfs占用过多内存时,可能导致系统其他服务因OOM(Out Of Memory)被杀死[^2]。 - Linux系统会尽量利用内存作为缓存(cache和buffer)以提高性能,这些缓存内存可以在需要时被回收[^3]。 用户当前问题:分析系统内存和tmpfs使用情况。 步骤: 1. 使用`free`命令查看系统整体内存使用情况,注意`available`字段表示可用内存(包括可回收的缓存)。 2. 检查tmpfs挂载点的使用情况(如/dev/shm以及其他自定义挂载点)。 3. 分析tmpfs占用内存是否过大,以及是否影响系统整体内存使用。 具体操作: ### 1. 查看整体内存使用 使用`free -h`命令: ```bash free -h ``` 输出示例: ``` total used free shared buff/cache available Mem: 15G 2.1G 1.2G 512M 12G 12G Swap: 2.0G 0B 2.0G ``` - **total**:物理内存总量。 - **used**:已使用内存(包括应用程序和部分缓存)。 - **free**:完全空闲的内存。 - **shared**:共享内存(主要是tmpfs占用的内存)。 - **buff/cache**:被内核缓冲区(buffer)和页面缓存(cache)使用的内存。这部分内存可以在需要时被回收。 - **available**:估计可用于启动新应用程序的内存(包括free内存和可回收的缓存)。 注意:`shared`列显示了tmpfs占用的内存(因为tmpfs使用共享内存)。但是,这个值可能不完整,因为多个tmpfs挂载点会共享内存。 ### 2. 检查tmpfs挂载点 使用`df`命令查看tmpfs挂载点的使用情况: ```bash df -h -t tmpfs ``` 输出示例: ``` Filesystem Size Used Avail Use% Mounted on tmpfs 7.8G 256K 7.8G 1% /run tmpfs 15G 0 15G 0% /sys/fs/cgroup tmpfs 7.8G 8.0M 7.8G 1% /tmp tmpfs 7.8G 50M 7.8G 1% /dev/shm ``` 这里显示了各个tmpfs挂载点的大小和使用情况。注意: - 挂载点的大小通常由挂载选项`size`指定,如果不指定,则默认为物理内存的一半(如引用[^1]所述)。 - 使用率高的tmpfs挂载点可能是内存占用大的原因。 ### 3. 分析tmpfs内存占用与系统内存的关系 tmpfs占用的内存会体现在`free`命令输出的`shared`和`buff/cache`中(因为tmpfs属于可回收内存)。但是,当tmpfs使用过多时,可能会挤压其他应用程序的内存空间,导致系统触发OOM killer。 引用[^2]提到:tmpfs占用太多内存可能导致服务OOM。因此,我们需要关注: - tmpfs的实际使用量(通过`df`查看)。 - 系统可用内存(`free`中的`available`)是否充足。 ### 4. 深入分析tmpfs内容 如果需要查看tmpfs挂载点下哪些文件占用了空间,可以使用`du`命令: ```bash # 例如,查看/dev/shm sudo du -sh /dev/shm/* ``` 注意:/dev/shm是共享内存的常见挂载点,一些应用程序(如数据库、缓存系统)会使用它。 ### 5. 调整tmpfs大小 如果发现某个tmpfs挂载点占用过大且不需要那么多空间,可以重新挂载以限制大小: ```bash sudo mount -o remount,size=1G /dev/shm ``` 将/dev/shm的大小限制为1GB(根据需求调整)。 ### 6. 监控内存回收情况 使用`vmstat`监控内存回收和交换情况: ```bash vmstat 1 5 ``` 关注`si`(swap in)和`so`(swap out)列,以及`free`和`cache`的变化。如果系统频繁交换,说明内存紧张。 ### 总结 - Linux系统内存使用包括应用程序内存、缓存(buff/cache)和tmpfs(共享内存)等。 - tmpfs是一种内存文件系统,其占用的内存属于可回收内存,但如果使用过多,仍可能导致内存不足。 - 分析步骤: 1. 使用`free`查看整体内存,关注`available`和`shared`。 2. 使用`df -t tmpfs`查看tmpfs挂载点的使用情况。 3. 必要时检查tmpfs下的大文件并调整挂载大小。 通过以上步骤,我们可以全面了解系统内存和tmpfs的使用情况,并采取相应措施优化内存使用。 §§相关问题§§ 1. 如何监控Linux系统的内存使用情况? 2. tmpfs和ramfs有什么区别? 3. 如何防止tmpfs占用过多内存导致系统OOM?</think>### Linux系统内存与tmpfs使用情况分析 根据您提供的引用资料,我将从内存管理机制和tmpfs特性出发,全面分析系统内存使用情况。以下是关键分析步骤和工具使用指南: --- ### 一、核心概念解析 1. **tmpfs文件系统** - 基于内存的临时文件系统,通常挂载在`/dev/shm`(默认大小为物理内存的1/2)[^1] - 特点:数据存储在内存中,重启后消失 - 双重作用: - 系统级:实现SYS V共享内存(无大小限制,仅受`/proc/sys/kernel/shmmax`约束)[^1] - 用户级:提供高速临时存储空间 2. **内存管理机制** Linux采用积极缓存策略: - **文件页缓存**:磁盘文件的缓存副本 - **匿名页**:进程堆栈等无文件背景的内存 - **可回收内存**:包括tmpfs和部分缓存(通过`kswapd`内核线程回收)[^3] - 内存使用公式: $$ \text{Total Memory} = \text{Free} + \text{Buffers} + \text{Cached} + \text{Used} $$ --- ### 二、诊断步骤与命令 #### 步骤1:查看整体内存状态 ```bash free -h ``` 输出示例: ``` total used free shared buff/cache available Mem: 15Gi 2.1Gi 1.2Gi 512Mi 12Gi 12Gi Swap: 2.0Gi 0B 2.0Gi ``` - **关键指标**: - `shared`:tmpfs占用量(本例512MiB) - `buff/cache`:可回收缓存(12GiB) - `available`:真实可用内存(含可回收部分) #### 步骤2:分析tmpfs详细使用 ```bash # 查看所有tmpfs挂载点 df -h -t tmpfs # 检查/dev/shm使用详情 sudo du -sh /dev/shm/* ``` 输出示例: ``` Filesystem Size Used Avail Use% Mounted on tmpfs 7.8G 256K 7.8G 1% /run tmpfs 15G 0 15G 0% /sys/fs/cgroup tmpfs 7.8G 1.5G 6.3G 19% /dev/shm <-- 重点关注 ``` #### 步骤3:检测共享内存进程 ```bash # 查看使用共享内存的进程 sudo lsof -S /dev/shm # 检查SYS V共享内存限制 cat /proc/sys/kernel/shmmax ``` #### 步骤4:排查内存回收问题 当`free`值小但`available`充足时正常(Linux积极缓存策略)[^3]。若出现OOM: ```bash # 检查不可回收内存 sudo slabtop -s c # 按缓存大小排序 # 查看OOM日志 dmesg | grep -i "oom\|kill" ``` --- ### 三、常见问题解决方案 #### 问题1:tmpfs占用过高导致OOM[^2] - **解决方案**: ```bash # 临时清理/dev/shm sudo rm -rf /dev/shm/large_file # 永久调整大小(限制为4GB) sudo mount -o remount,size=4G /dev/shm ``` #### 问题2:共享内存泄漏 - **检测方法**: ```bash ipcs -m | awk '$6>1000000 {print}' # 显示>1MB的共享段 ``` - **清理无效共享段**: ```bash ipcrm -m [shmid] # 删除指定共享内存 ``` #### 问题3:缓存回收异常 调整内核参数(`/etc/sysctl.conf`): ```conf vm.vfs_cache_pressure=100 # 提高缓存回收优先级 vm.swappiness=10 # 减少交换倾向 ``` --- ### 四、内存分析流程图 ```mermaid graph TD A[free -h] --> B{shared是否过高?} B -->|是| C[df -h -t tmpfs] B -->|否| D[检查buff/cache] C --> E{/dev/shm是否异常?} E -->|是| F[清理或调整大小] E -->|否| G[检查SYS V共享内存] D --> H{available是否充足?} H -->|是| I[正常,无需操作] H -->|否| J[检查slab和进程内存] ``` > 注:当`free`值小但`available`充足时,属于Linux正常内存优化策略[^3],无需干预。 --- ### 五、关键配置文件 1. **tmpfs大小调整**: `/etc/fstab`中修改挂载参数: ``` tmpfs /dev/shm tmpfs defaults,size=4G 0 0 ``` 2. **共享内存限制**: 修改`/proc/sys/kernel/shmmax`(临时)或`/etc/sysctl.conf`(永久): ```conf kernel.shmmax=2147483648 # 2GB限制 ``` 通过以上分析,您可以精确掌握tmpfs和系统内存的使用状况,有效预防OOM等问题。若需进一步诊断特定进程,建议使用`smem`或`valgrind`工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值