`

linux /dev/shm的用途

 
阅读更多

1.linux下的/dev/shm是什么?

/dev/shm/是linux下一个目录,/dev/shm目录不在磁盘上,而是在内存里,因此使用linux /dev/shm/的效率非常高,直接写进内存。

我们可以通过以下两个脚本来验证linux /dev/shm的性能:

[root@db1 oracle]# ls -l linux_11gR2_grid.zip
-rw-r--r-- 1 oracle dba 980831749 Jul 11 20:18 linux_11gR2_grid.zip
[root@db1 oracle]# cat mycp.sh
#!/bin/sh
echo `date`
cp linux_11gR2_grid.zip ..
echo `date`
[root@db1 oracle]# ./mycp.sh
Fri Jul 15 18:44:17 CST 2011
Fri Jul 15 18:44:29 CST 2011

[root@db1 shm]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/rootvg-lv01
                       97G  9.2G   83G  10% /
/dev/sda1              99M   15M   80M  16% /boot
tmpfs                 2.0G     0  2.0G   0% /dev/shm

[root@db1 oracle]# cat mycp1.sh
#!/bin/sh
echo `date`
cp linux_11gR2_grid.zip /dev/shm
echo `date`
[root@db1 oracle]# ./mycp1.sh
Fri Jul 15 18:44:29 CST 2011
Fri Jul 15 18:44:30 CST 2011
[root@db1 oracle]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/rootvg-lv01
                       97G  9.2G   83G  10% /
/dev/sda1              99M   15M   80M  16% /boot
tmpfs                 2.0G  937M  1.1G  46% /dev/shm
[root@db1 oracle]#

可以看出,在对一个将近1g为文件的复制,拷到磁盘上与拷到/dev/shm下还是有很大差距的。

tmpfs有以下特点:
1.tmpfs 是一个文件系统,而不是块设备;您只是安装它,它就可以使用了。
2.动态文件系统的大小。
3.tmpfs 的另一个主要的好处是它闪电般的速度。因为典型的 tmpfs 文件系统会完全驻留在 RAM 中,读写几乎可以是瞬间的。
4.tmpfs 数据在重新启动之后不会保留,因为虚拟内存本质上就是易失的。所以有必要做一些脚本做诸如加载、绑定的操作。

2.linux /dev/shm 默认容量

linux下/dev/shm的容量默认最大为内存的一半大小,使用df -h命令可以看到。但它并不会真正的占用这块内存,如果/dev/shm/下没有任何文件,它占用的内存实际上就是0字节;如果它最大为1G,里头放有100M文件,那剩余的900M仍然可为其它应用程序所使用,但它所占用的100M内存,是绝不会被系统回收重新划分的,否则谁还敢往里头存文件呢?

通过df -h查看linux /dev/shm的大小

[root@db1 shm]# df -h /dev/shm
Filesystem            Size  Used Avail Use% Mounted on
tmpfs                 1.5G     0  1.5G   0% /dev/shm

3.linux /dev/shm 容量(大小)调整

linux /dev/shm容量(大小)是可以调整,在有些情况下(如oracle数据库)默认的最大一半内存不够用,并且默认的inode数量很低一般都要调高些,这时可以用mount命令来管理它。
mount -o size=1500M -o nr_inodes=1000000 -o noatime,nodiratime -o remount /dev/shm
在2G的机器上,将最大容量调到1.5G,并且inode数量调到1000000,这意味着大致可存入最多一百万个小文件

通过/etc/fstab文件来修改/dev/shm的容量(增加size选项即可),修改后,重新挂载即可:

[root@db1 shm]# grep tmpfs /etc/fstab
tmpfs                   /dev/shm                tmpfs   defaults,size=2G        0 0
[root@db1 /]# umount /dev/shm
[root@db1 /]# mount /dev/shm
[root@db1 /]# df -h /dev/shm
Filesystem            Size  Used Avail Use% Mounted on
tmpfs                 2.0G     0  2.0G   0% /dev/shm

[root@db1 /]# # mount -o remount /dev/shm
[root@db1 /]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/rootvg-lv01
                       97G  9.2G   83G  10% /
/dev/sda1              99M   15M   80M  16% /boot
tmpfs                 2.0G     0  2.0G   0% /dev/shm

附:tmpfs文档

Tmpfs is a file system which keeps all files in virtual memory.

Everything in tmpfs is temporary in the sense that no files will be
created on your hard drive. If you unmount a tmpfs instance,
everything stored therein is lost.

tmpfs puts everything into the kernel internal caches and grows and
shrinks to accommodate the files it contains and is able to swap
unneeded pages out to swap space. It has maximum size limits which can
be adjusted on the fly via ‘mount -o remount …’

If you compare it to ramfs (which was the template to create tmpfs)
you gain swapping and limit checking. Another similar thing is the RAM
disk (/dev/ram*), which simulates a fixed size hard disk in physical
RAM, where you have to create an ordinary filesystem on top. Ramdisks
cannot swap and you do not have the possibility to resize them.

Since tmpfs lives completely in the page cache and on swap, all tmpfs
pages currently in memory will show up as cached. It will not show up
as shared or something like that. Further on you can check the actual
RAM+swap use of a tmpfs instance with df(1) and du(1).

tmpfs has the following uses:

1) There is always a kernel internal mount which you will not see at
all. This is used for shared anonymous mappings and SYSV shared
memory.

This mount does not depend on CONFIG_TMPFS. If CONFIG_TMPFS is not
set, the user visible part of tmpfs is not build. But the internal
mechanisms are always present.

2) glibc 2.2 and above expects tmpfs to be mounted at /dev/shm for
POSIX shared memory (shm_open, shm_unlink). Adding the following
line to /etc/fstab should take care of this:

tmpfs /dev/shm tmpfs defaults 0 0

Remember to create the directory that you intend to mount tmpfs on
if necessary (/dev/shm is automagically created if you use devfs).

This mount is _not_ needed for SYSV shared memory. The internal
mount is used for that. (In the 2.3 kernel versions it was
necessary to mount the predecessor of tmpfs (shm fs) to use SYSV
shared memory)

3) Some people (including me) find it very convenient to mount it
e.g. on /tmp and /var/tmp and have a big swap partition. But be
aware: loop mounts of tmpfs files do not work due to the internal
design. So mkinitrd shipped by most distributions will fail with a
tmpfs /tmp.

4) And probably a lot more I do not know about :-)

tmpfs has a couple of mount options:

size: The limit of allocated bytes for this tmpfs instance. The
default is half of your physical RAM without swap. If you
oversize your tmpfs instances the machine will deadlock
since the OOM handler will not be able to free that memory.
nr_blocks: The same as size, but in blocks of PAGECACHE_SIZE.
nr_inodes: The maximum number of inodes for this instance. The default
is half of the number of your physical RAM pages.

These parameters accept a suffix k, m or g for kilo, mega and giga and
can be changed on remount.

To specify the initial root directory you can use the following mount
options:

mode: The permissions as an octal number
uid: The user id
gid: The group id

These options do not have any effect on remount. You can change these
parameters with chmod(1), chown(1) and chgrp(1) on a mounted filesystem.

So ‘mount -t tmpfs -o size=10G,nr_inodes=10k,mode=700 tmpfs /mytmpfs’
will give you tmpfs instance on /mytmpfs which can allocate 10GB
RAM/SWAP in 10240 inodes and it is only accessible by root.

TODOs:

1) give the size option a percent semantic: If you give a mount option
size=50% the tmpfs instance should be able to grow to 50 percent of
RAM + swap. So the instance should adapt automatically if you add
or remove swap space.
2) loop mounts: This is difficult since loop.c relies on the readpage
operation. This operation gets a page from the caller to be filled
with the content of the file at that position. But tmpfs always has
the page and thus cannot copy the content to the given page. So it
cannot provide this operation. The VM had to be changed seriously
to achieve this.
3) Show the number of tmpfs RAM pages. (As shared?)

Author:
Christoph Rohland , 1.12.01

分享到:
评论

相关推荐

    linux上的heartbeat双机热备服务架设分享.pdf

    2. **分区布局**:系统一般会为不同用途分配不同的挂载点,如根目录(/)、数据存储(/Datas)、引导分区(/boot)和共享内存(/dev/shm)。另外,预留500MB或更大的raw空间用于Heartbeat的共享存储。 3. **操作...

    CentOS常用命令

    tmpfs 4.0G 0 4.0G 0% /dev/shm ``` **命令:** `fdisk -l` - **用途:** 显示所有磁盘分区的详细信息。 - **示例输出:** ``` Disk /dev/sda: 250 GB, 250059350016 bytes, 488398168 sectors Units = sectors ...

    Shell编程基础

    tmpfs 295M 0 295M 0% /dev/shm tmpfs 295M 5.6M 289M 2% /run tmpfs 295M 0 295M 0% /sys/fs/cgroup /dev/sda1 1014M 135M 880M 14% /boot tmpfs 59M 0 59M 0% /run/user/0 ``` 通过以上内容的学习,我们...

    改进A星算法:实现多个机器人与AGV小车路径规划与动态避障的完整Matlab代码

    内容概要:本文介绍了如何利用改进的A星算法实现多个机器人和AGV小车的路径规划与动态避障。主要内容分为四个部分:首先是环境创建,通过矩阵表示地图并在特定位置设定障碍物;其次是机器人(小车)位置设置,指定起始点和目标点;然后重点讲解了改进后的A星算法,在原有基础上增加了对其他机器人位置和路径的考量,以避免碰撞;最后展示了路径规划的具体步骤以及结果显示方式。此外,文中还提供了详细的代码片段,涵盖从环境构建到路径规划的全过程,并讨论了一些优化技巧如路径冲突检测、动态权重调整等。 适合人群:从事机器人导航系统开发的研究人员和技术爱好者,特别是那些希望深入了解路径规划算法及其应用的人群。 使用场景及目标:适用于需要解决多机器人协作任务的企业和个人开发者,旨在提高自动化设备在复杂环境中的自主行动能力,确保高效且安全地完成预定任务。 其他说明:作者强调了该方法对于仓储物流等行业的重要性,并指出传统A星算法在此类应用场景中存在的局限性。同时提醒读者关注Matlab版本兼容性和实际部署时可能遇到的问题。

    【Windows系统管理】创建任务计划实现软件开机自启动:任务计划配置与BAT脚本自动化方法详解

    内容概要:本文档详细介绍了三种在Windows系统中创建任务计划以实现软件开机启动的方法。第一种方法是通过任务计划创建,包括打开任务计划、设置常规参数、触发器和操作,最终实现软件在系统重启后自动启动;第二种方法是通过降低用户权限来避免软件启动时出现UAC权限询问弹窗,具体步骤为调整用户账户控制设置到最低级别;第三种方法是利用bat脚本创建任务计划,提供了详细的脚本代码,包含管理员权限检查、可配置变量设置、创建任务命令以及相关辅助命令,同时提醒用户注意安全软件可能对任务创建或执行的限制。 适合人群:适用于有一定Windows操作系统使用经验,特别是需要设置软件开机自启动的计算机用户或IT运维人员。 使用场景及目标:①希望在系统重启后自动运行特定软件的用户;②希望通过脚本批量部署开机启动任务的企业IT管理员;③解决软件启动时UAC权限弹窗问题的用户。 阅读建议:对于想要深入了解任务计划创建机制和bat脚本编程的读者来说,建议仔细研究第三种方案中的脚本代码及其说明部分,并尝试在测试环境中进行实践操作。对于普通用户,则重点掌握前两种简单易行的方法即可。

    COMSOL实现双孔单渗透瓦斯抽采:分析煤层内裂隙与基质渗流及应力分布

    内容概要:本文详细介绍了如何使用COMSOL软件构建并实现双孔单渗透瓦斯抽采模型,探讨了煤层内部基质和裂隙的应力分布与渗透率之间的关系。文章首先解释了双孔单渗透模型的基础概念,即瓦斯在基质和裂隙中的流动特性。随后,逐步展示了如何在COMSOL环境中搭建几何模型、定义物理场以及设置材料属性,特别关注了裂隙和基质渗透率的定义及其随应力变化的影响。此外,文章还讨论了多物理场耦合的方法,如将固体力学与地下水流模块相结合,以模拟应力对裂隙渗透率的影响。最后,通过对不同渗透率条件下瓦斯流速和压力分布的模拟,揭示了优化瓦斯抽采方案的关键因素。 适合人群:从事煤矿安全工程、瓦斯抽采研究的专业人士和技术人员。 使用场景及目标:适用于希望深入了解煤层内瓦斯流动机制的研究人员,旨在提高瓦斯抽采效率,确保煤矿生产的安全性和经济性。 其他说明:文中提供了详细的建模步骤和代码片段,帮助读者更好地理解和复现实验结果。同时,强调了模型验证和优化的重要性,提出了若干实用技巧以应对常见的建模挑战。

    Rust高性能日志滚动:RollingFileAppender.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Rust 以内存安全、零成本抽象和并发高效的特性,重塑编程体验。无需垃圾回收,却能通过所有权与借用检查机制杜绝空指针、数据竞争等隐患。从底层系统开发到 Web 服务构建,从物联网设备到高性能区块链,它凭借出色的性能和可靠性,成为开发者的全能利器。拥抱 Rust,解锁高效、安全编程新境界!

    敏矽微ME32G030系列 keil 扩展包

    敏矽微ME32G030系列 keil 扩展包

    西门子S7-200 Smart PLC与台达MS300变频器及欧姆龙E5CC温控器通讯程序:昆仑通态触摸屏控制实现与扩展模块SB CM01通讯的集成方案

    内容概要:本文详细介绍了如何使用西门子S7-200 Smart PLC与台达MS300变频器和欧姆龙E5CC温控器进行Modbus RTU通讯的具体实现步骤。主要内容涵盖硬件连接、参数设置、PLC程序编写、触摸屏配置等方面。文中不仅提供了详细的参数配置指导,如波特率、数据格式等,还展示了具体的梯形图代码和注意事项,确保各个设备之间的稳定通讯。此外,还分享了一些常见的调试问题及其解决方案。 适合人群:具备一定PLC编程基础的技术人员,尤其是从事自动化控制系统集成工作的工程师。 使用场景及目标:适用于需要集成多种工业设备的自动化控制系统项目,帮助工程师快速掌握不同品牌设备间的通讯方法,提高系统集成效率,减少调试时间和成本。 其他说明:文中提到的所有设备均采用Modbus RTU协议进行通讯,硬件连接主要涉及RS485接口和以太网接口。对于初学者来说,建议先熟悉Modbus协议的基本概念和通讯机制,以便更好地理解和应用本文的内容。

    Rust内存安全指针:NonNull优化技巧.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Rust 以内存安全、零成本抽象和并发高效的特性,重塑编程体验。无需垃圾回收,却能通过所有权与借用检查机制杜绝空指针、数据竞争等隐患。从底层系统开发到 Web 服务构建,从物联网设备到高性能区块链,它凭借出色的性能和可靠性,成为开发者的全能利器。拥抱 Rust,解锁高效、安全编程新境界!

    大作业自媒体上传需要文档

    大作业自媒体上传需要文档

    基于id=0控制的电机定子参数辨识方法——通过递推最小二乘法对R, ψf, Ls的仿真研究

    内容概要:本文详细介绍了基于id=0控制的电机参数辨识方法,主要采用递推最小二乘法(RLS)对电机定子电阻R、永磁磁链ψf及dq轴电感Ls进行在线辨识。文章首先阐述了id=0控制策略及其优势,接着展示了RLS算法的具体实现过程,包括参数初始化、增益矩阵计算、参数更新和协方差矩阵更新。文中还讨论了采样频率的选择、积分环节的优化以及噪声处理等问题,并通过仿真实验验证了该方法的有效性和稳定性。此外,作者分享了一些实践经验,如针对不同厂家电机的适应性调整和在线参数校验技巧。 适合人群:从事电机控制及相关领域的研究人员和技术人员,尤其是对永磁同步电机参数辨识感兴趣的读者。 使用场景及目标:适用于需要精确辨识电机参数的场合,如高性能电机控制系统的设计与优化。目标是帮助读者掌握RLS算法在电机参数辨识中的应用,提高电机控制系统的性能和可靠性。 其他说明:文章提供了详细的代码示例和仿真结果,便于读者理解和实践。同时强调了物理直觉在参数辨识中的重要性,指出理论模型与实际情况可能存在差异,需灵活应对。

    基于单片机的智能大棚浇花花盆设计:光照、温度和土壤湿度监测与控制系统

    内容概要:本文详细介绍了一个基于单片机的智能大棚与花盆浇花系统的硬件和软件设计方案。硬件方面,系统集成了单片机、光敏电阻、A/D模块PCF8591、DS18B20温度传感器、土壤湿度传感器、1602液晶显示屏、按键、高亮LED灯、补温灯、风扇、继电器和水泵等多种组件。软件部分采用C语言编写,实现了光照、温度和土壤湿度的检测与控制。具体来说,通过光敏电阻和PCF8591进行光照检测与补光控制;利用DS18B20进行温度检测,并根据温度范围控制补温灯和风扇;通过土壤湿度传感器和继电器控制水泵进行精准浇水。此外,还提供了按键设置阈值等功能,确保系统的灵活性和实用性。 适合人群:对嵌入式系统和智能农业感兴趣的电子爱好者、学生和初学者。 使用场景及目标:适用于家庭园艺、小型农场等场合,旨在提供一种低成本、高效的自动化灌溉和环境控制系统,帮助用户更好地管理和维护植物生长环境。 其他说明:文中还提到了一些常见的硬件注意事项和技术细节,如I2C通信、单总线协议、延时处理等,有助于读者理解和调试系统。

    Rust跨语言异常传播:panic处理.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 Rust 以内存安全、零成本抽象和并发高效的特性,重塑编程体验。无需垃圾回收,却能通过所有权与借用检查机制杜绝空指针、数据竞争等隐患。从底层系统开发到 Web 服务构建,从物联网设备到高性能区块链,它凭借出色的性能和可靠性,成为开发者的全能利器。拥抱 Rust,解锁高效、安全编程新境界!

    离合器外圈钻孔专用机床的设计与研究.pdf

    离合器外圈钻孔专用机床的设计与研究.pdf

    基于PLC控制的纯净水灌装生产饮料厂电控系统设计:梯形图程序、接线图与组态画面详解

    内容概要:本文详细介绍了基于PLC(三菱FX3U)的纯净水灌装线电控系统的设计与优化。首先解释了IO分配表的作用及其具体配置,接着深入剖析了梯形图程序的关键逻辑,包括启保停电路、灌装控制逻辑以及保护机制。此外,还探讨了硬件接线的注意事项,如传感器电源隔离、电机接触器保护等。组态画面设计方面,强调了操作便捷性和故障诊断功能。最后分享了一些调试过程中遇到的实际问题及解决方案,如电压骤降引起的随机波动、电磁阀关闭延迟等。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对PLC控制系统有兴趣的学习者。 使用场景及目标:适用于希望深入了解PLC控制系统设计原理及应用的技术人员。目标是掌握纯净水灌装线电控系统的完整设计流程,提高系统的稳定性和效率。 其他说明:文中提到的具体案例和实践经验有助于读者更好地理解和应对实际工程中的挑战。

    gaoliwei1102_multi_ML_emtion_analysis_csdn_2660_1746371732584.zip

    gaoliwei1102_multi_ML_emtion_analysis_csdn_2660_1746371732584

    Java企业级开发_SpringBoot_MyBatis_MySQL_Druid_Swagger_Lombok_FastJson_通用Mapper_分页插件_代码生成器_RESTf.zip

    Java企业级开发_SpringBoot_MyBatis_MySQL_Druid_Swagger_Lombok_FastJson_通用Mapper_分页插件_代码生成器_RESTf

    Delphi 12.3控件之RADStudio-12-3-29-0-55362-2017-KeyPatch.7z

    Delphi 12.3控件之RADStudio-12-3-29-0-55362-2017-KeyPatch.7z

    Go语言编译器优化:-gcflags参数深度解析手册.pdf

    文档支持目录章节跳转同时还支持阅读器左侧大纲显示和章节快速定位,文档内容完整、条理清晰。文档内所有文字、图表、函数、目录等元素均显示正常,无任何异常情况,敬请您放心查阅与使用。文档仅供学习参考,请勿用作商业用途。 编译闪电般迅速,并发性能卓越,部署轻松简单!Go 语言以极简设计理念和出色工程性能,成为云原生时代的首选编程语言。从 Docker 到 Kubernetes,全球顶尖科技企业都在采用 Go。点击了解 Go 语言的核心优势、实战窍门和未来走向,开启高效编程的全新体验!

Global site tag (gtag.js) - Google Analytics