
今天小编要跟大家分享的文章是关于Unix/Linux命令行下的工具分享,相信正在从事Linux相关工作对此并不陌生。有一些是大家熟悉的,有一些是非常有用的,有一些是不为人知的。 Linux运维工作的小伙伴快来看一看吧,希望能够对大家有所帮助 ! 1、lftp 利用lftp命令行ftp工具进行网站数据的增量备份,镜像,就像使用rsync一样。 2、ack ack是一个perl脚本,是grep的一个可选替换品。其可以对匹配字符有高亮显示。是为程序员专门设计的,默认递归搜索,省提供多种文件类型供选。 Unix/Linux命令行下的工具分享 3、calcurse & remind + wyrd calcurse是一个命令行下的日历和日程软件。remind + wyrd也很类似。关于日历,我不得不提一个Linux的Cycle日历,也是一个神器,呵呵。 Unix/Linux命令行下的工具分享 4、newsbeuter & rsstail newsbeuter和rsstail是命令行下RSS的阅读工具。 Unix/Linux命令行下的工具分享 5、powertop 做个环保的程序员,看看自己的电脑里哪些程序费电。PowerTOP是一个让Intel平台的笔记本电脑节省电源的Linux工具。此工具由Intel公司发布。它可以帮助用户找出那些耗电量大的程序,通过修复或者关闭那些应用程序或进程,从而为用户节省电源。 Unix/Linux命令行下的工具分享 6、htop & iotop htop和iotop 用来查看进程,内存和IO负载。 Unix/Linux命令行下的工具分享 7、ttyrec & ipbt ttyrec是一个tty控制台录制程序,其所录制的数据文件可以使用与之配套的ttyplay播放。不管是你在tty中的各种操作,还是在tty中耳熟能详的软件,都可进行录制。 ipbt是一个用来回放ttyrec所录制的控制台输入过程的工具。 与此类似的还有Shelr 和 termrec Unix/Linux命令行下的工具分享 8、rsyn 通过SSH进行文件同步的经典工具(核心算法) Unix/Linux命令行下的工具分享 9、mtr MTR – traceroute 2.0,其是把traceroute和ping集成在一块的一个小工具 用于诊断网络。 Unix/Linux命令行下的工具分享 10、socat & netpipes socat是一个多功能的网络工具,名字来由是” Socket CAT”,可以看作是netcat的N倍加强版。 Unix/Linux命令行下的工具分享 netpipes和socat一样,主要是用来在命令行来进行socket操作的命令,这样你就可以在Shell脚本下行进socket网络通讯了。
vim是一个向上兼容于vi的文本编辑器,可用于编辑各种纯文本。它对编辑程序特别有用。基本模式:编辑模式:默认编辑文件进入的模式输入模式:末行模式:内置的命令行接口基本使用: # vim [options] [file ..]+#:打开文件后,直接让光标处于第#行的行首;+/PATTERN:打开文件后,直接让光标处于第一个被PATTERN匹配到的行的行; 模式转换:编辑模式:默认模式 编辑模式 -> 输入模式: i:insert,在光标所在处输入; a: append,在光标在处后方输入; o:在光标所在处的下方打开一个新行; I:在光标所在行的行首输入; A:在光标所在行的行尾输入; O:在光标所在处的上方打开一个新行; 输入模式 -> 编辑模式 ESC键 编辑模式 -> 末行模式 :键 末行模式 -> 编辑模式 ESC键 关闭文件:1.编辑模式下: ZZ:保存并退出; ZQ:不保存直接退出; 2.进入末行模式: :q 退出 :q! 强制退出,不保存此前的编辑操作 :wq 保存并退出; :w, :q :x 保存并退出; :w /PATH/TO/SOMEFILE 保存到指定文件 命令模式光标跳转光标跳转: 字符间跳转 h:左 j:下 k:上 l:右 现在直接上下左右键 COMMAND:跳转由#指定的个数的字符; 单词间跳转 w:下一个单词的词首;e:当前或后一个单词的词尾;b:当前或前一个单词的词首; COMMAND:跳转由#指定的个数的单词; 行首行尾跳转 ^:跳转至行首的第一个非空白字符;0:跳转至行首;$:跳转至行尾; 行间跳转 G:跳转至由#指定的行; 1G, gg:第一行;G:最后一行; 句间跳转: ) 下一句( 上一句 段间跳转 } 下一段{ 上一段 翻屏: Ctrl+f:向文件尾翻一屏Ctrl+b:向文件首部翻一屏Ctrl+d:向文件尾部翻半屏Ctrl+u:向文件首部翻半屏Enter:按行向后翻当前页跳转: H:页首M:页中间行L:页底zt:将光标所在当前行移到屏幕顶端zz:将光标所在当前行移到屏幕中间zb:将光标所在当前行移到屏幕底端 vim的编辑命令:字符编辑: 默认模式 x:删除光标所在处的字符; #x:删除光标所在处起始的#个字符; xp:交换光标所在处的字符与其后面的字符的位置; 替换命令(replace): r:替换光标所在处的字符; rCHAR ~:大小写切换 删除命令: 编辑模式删除 d:删除命令,可结合光标跳转字符,实现范围删除; d$:删除光标所在位置到行尾的字符; d^:删除光标所在位置到非空行首的字符; d0:删除光标所在位置到行首的字符; dw:删除光标所在位置到下个单词词首的字符 de:删除光标所在位置到当前单词或下个单词词尾的字符 db:删除光标所在位置到当前单词或上一个单词单首的字符 #COMMAND: D:等同于d$ dd:删除光标所在处的行; #dd:删除光标所处的行起始的共#行; 粘贴命令(p, put, paste): 编辑模式粘贴 p:缓冲区中的内容如果为整行,则粘贴在当前光标所在行的下方;否则,则粘贴至当前光标所在处的后方; P:缓冲区中的内容如果为整行,则粘贴在当前光标所在行的上方;否则,则粘贴至当前光标所在处的前方; 复制命令(yank, y): 编辑模式复制 y:复制,工作行为相似于d命令; y$:复制光标所在位置到行尾的字符 y^:复制光标所在位置到非空行首的字符 y0:复制光标所在位置到行首的字符 ye:复制标所在位置到当前单词或下个单词词尾的字符 yw:复制光标所在位置到下个单词词首的字符 yb:复制光标所在位置到当前单词或上一个单词单首的字符 #COMMAND yy:复制一整行 #yy:复制#行 改变命令(change, c): 编辑模式 --> 输入模式,实现删除操作; c$:删除光标所在位置到行尾的字符并且切换为输入模式; c^:删除光标所在位置到非空行首的字符并且切换为输入模式; c0:删除光标所在位置到行首的字符并且切换为输入模式; cb:删除光标所在位置到当前单词或上一个单词单首的字符并且切换为输入模式; ce:删除光标所在位置到当前单词或下个单词词尾的字符并且切换为输入模式; cw:删除光标所在位置到下个单词词首的字符并且切换为输入模式; #COMMAND cc:删除光标所在的行,并且切换为输入模式; #cc:删除#行并且切换为输入模式; 其它编辑操作: 可视化模式: 选定字符 v:按字符选定; V:按行选定; 结合编辑命令使用:d, c, y 撤销(undo)操作: u:撤销此前的操作; #u:撤销此前的#个操作; 撤销此前的撤销: Ctrl+r 重复执行前一个编辑操作: . vim自带的练习教程:vimtutor vim末行模式:内建的命令行接口 (1) 地址定界 :start_pos[,end_pos] #:特定的第#行,例如5即第5行; .:当前行; $:最后一行; #,#:指定行范围,左侧为起始行,右侧为结束行; #,+#:指定行范围,左侧为超始行绝对编号,右侧为相对左侧行号的偏移量;例如:3,+7 .,$-1:范围为当前行指倒数第二行 1,$:范围为第一行至最后一行 %:全文 /pattern/:从光标所在处起始向文件尾部第一次被模式所匹配到的行; /first/,$:从光标所在处起始,第一次由pat1匹配到的行开始,至最后一行中间的所有行 /pat1/,/pat2/:从光标所在处起始,第一次由pat1匹配到的行开始,至第一次由pat2匹配到的行结束之间的所有行; 可同编辑命令一同使用,实现编辑操作: d:地址定界后接d实现删除该定界范围内的行 y:地址定界后接d实现复制该定界范围内的行 c:地址定界后接d实现替换该定界范围内的行并且切换为输入模式 w /PATH/TO/SOMEFILE:将范围内的文本保存至指定的文件中; r /PATH/FROM/SOMEFILE:将指定的文件中的文本读取并插入至指定位置; (2) 查找 模式匹配查找 /PATTERN:从当前光标所在处向文件尾部查找能够被当前模式匹配的所有字符串; ?PATTERN:从当前光标所在处向文件首部查找能够被当前模式匹配到的所有字符串; n:下一个,与命令方向相同; N:上一个,与命令方向相反; (3) 查找并替换 s:末行模式的命令; 使用格式: s/要查找的内容/替换为的内容/修饰符 要查找的内容:可使用正则表达式; 替换为的内容:不能使用正则表达式,但可以引用; 如果“要查找的内容”部分在模式中使用分组符号:在“替换为的内容”中使用后向引用; 直接引用查找模式匹配到的全部文本,要使用&符号; 修饰符: i:忽略大小写; g:全局替换,意味着一行中如果匹配到多次,则均替换; 可把分隔符替换为其它非常用字符: s@@@ s### 示例: %s@\<t\([[:alpha:]]\+\)\>@T\1@g %s@\<t[[:alpha:]]\+\>@&er@g vim的多文件功能:多文件: vim FILE1 FILE2 ... 在文件间切换: :next 下一个 :prev 上一个 :first 第一个 :last 最后一个 退出所有文件: :wqall 保存所有文件并退出; :wall :qall 多窗口: 窗口分割 -o:水平分割窗口 -O:垂直分割窗口 在窗口间切换:Ctrl+w, ARROW 注意:单个文件也可以分割为多个窗口进行查看: Ctrl+w, s:水平分割窗口 Ctrl+w, v:垂直分割窗口 定制vim的工作特性:注意:在末行模式下的设定,仅对当前vim进程有效; 永久有效: 全局:/etc/vimrc 用户个人:~/.vimrc 1、行号 显示:set number, 简写为set nu 取消显示:set nomber, set nonu 2、括号匹配高亮 匹配:set showmatch, set sm 取消:set nosm 3、自动缩进 启用:set ai 禁用:set noai 4、高亮搜索 启用:set hlsearch 禁用:set nohlsearch 5、语法高亮 启用:syntax on 禁用:syntax off 6、忽略字符大小写 启用:set ic 禁用:set noic 获取帮助: :help :help subject
在2014年接近尾声时,CoreOS在Docker发布了Rocket,声称Docker的流程模型有着“根本性的缺陷”。虽然CoreOS的创始人Alex Polvi尽量缓和语气,但是他坚持自己的基本观点,Docker不再是构建系统的最佳组件。 容器技术最近异军突起,所以很容易看出为什么Polvi这么积极地跑马圈地。因为容器之争才刚刚开始,不过,更严重的问题是供应商之间这样来回的争吵是否会吓跑那些想要采用容器技术的企业,至少让他们等到争论尘埃落定时。 平台 vs. 组件 CoreOS的Plovi和Docker的创始人Solomon Hykes在一点上有着共识:Rocket和Docker实际上不是竞争关系。Hykes说,Rocket“实际上是libcontainer的竞争对手”,而不是整体Docker平台的竞争对手。Libcontainer,是“为容器制定配置选项”的库,它对于Docker至关重要,它也是社区的努力结果,能帮助定义容器的未来。 正如InforWorld的Serdar Yegulap所写,Libcontainer非常重要。 但是Plovi显然觉得Docker忽略了它自己的核心愿望而想去做更多 – 成为平台。 Polvi 说: "Docker一开始是用来构建平台的组件。一个构建模块。一个可以集成到现有系统使其可以使用容器的东西。这是Docker的最初价值,帮助构建东西的简单工具,这也是我觉得Docker能在今天这么成功的原因。" 这在有些方面这有点像“我们想回到过去的黄金年代”,但是Plovi坚持这不是反Docker,而是希望Docker继续作为一个开放组件来帮助构建其他系统: Docker[现在]本身就是一个平台,不是构建模块。这是坏事吗?不,它只不过不再是构建系统的最佳组件。包括我们的系统,在这上面我们想要使用容器来构建OS。 我们认为还需要这样的组件存在,让其他系统能与之集成。我们认为Docker的初衷仍然是正确的,因此我们想确保它继续存在。这就是我们开发Rocket的原因。 然而,问题是在某些方面,当想要构建业务时,Docker可能有意或无意地使得在其上构建其他业务变得困难。Polvi继续说: "Docker平台和Rocket是完全不同的东西。Docker平台是一个产品。Rocket是一个组件。公司可能会选择Docker平台替代 [Pivotal的]Cloud Foundry。而像Cloud Foundry这样的公司却会使用类似Rocket这样的组件来构建Cloud Foundry。" 不管你的公司是需要Docker还是Rocket(或者其他容器技术),最终都是要构建出想要构建的东西。但是公司可以用Docker,平台,加上libcontainer作为Polvi的可组合组件吗? 绝对有可能。这正是让人困惑的地方。 Rocket有存在的必要吗? 开源世界经常会开发出一些没有实际价值的东西。有时候有些东西之后会变得有价值,但更多的时候却没有。 Docker替代了Linux 内核的LXC,这种容器技术已经存在了好多年。但是Pivotal的Andrew Clay Shafer指出,“Docker解决了[LXC的]可用性问题,使得这种技术可以被使用。” 同样,CoreOS极大得改进了Docker。Pivotal的Cloud Foundry的执行官James Watters说,Rocket“是给市场带来新思路的非常重要的一步,它始终以多平台容器思想为中心。”它也承诺会改进Docker的安全性。 不是所有人都同意。 虽然Hykes承认Rocket提供了“一些好的想法,我们会引入”,但是他认为Rocket没有像CoreOS那样本质的改进,包括改进的安全性和可组合性。 可能对,也可能不对。Rocket的受欢迎程度说明它的确满足了行业的深层次需求。即使Docker扩展其功能来提高易用性,大多数人可能更想要一个更为独立的容器库,这样能更容易得将它集成到现有的项目或者环境当中。Libcontainer可能是解决方法,但是开发人员看上去更喜欢Rocker的回到初心(back-to-basics)的方式。 消除困惑 这再次给企业们提出了问题:他们需要Docker还是Rocket?答案很可能是都需要。 有人担心这两种相互竞争的技术带给客户的困惑可能比帮助更多。Polvi说,即便如此,业界,包括竞争对手们,都认同的是,容器的价值。 在这个全新的领域,每个人都希望容器能帮助客户成功。我们觉得必须要做些事情(包括安全,可组件性,和公开标准)来确保容器能应用于企业里。我们认为Rocket在此有所帮助,并且鼓励Docker也转到这个正确的方向上。 这就是竞争所起的作用,更准确地说,这就是开源所起的作用。Polvi立刻回应,“总得来说,对于开发组件而不是产品,开源非常有效。”寻求开源容器技术的企业,最好记住这一点,开源能帮助更好地开发构建组件,而不是完成整个企业产品的开发。 这还意味着,Polvi继续说,CoreOS最主要的竞争对手不是Docker,而是“将所有东西自己攒在一起的内部组织。” “虽然大企业会继续有自己专门的小组来构建其系统的基础架构,CoreOS(和Docker)相信他们“可以给那些不想靠自己搭建所有东西,但是想达到大企业同等级别基础架构的公司提供解决方案。” 从另外一方面,Rocket是一个开源组件,可以帮助企业构建系统,而Docker,根据Polvi的说法,想要自己成为系统/平台。这是两种完全不一样的方式,两者都需要。哪种更适合你的项目取决于你到底想要构建什么。好啦,今天的分享到这里就结束了,如果需要更多的技术性文章,可以直接访问马哥教育官网!
在这此对新版本jmeter的学习+温习的过程,发现了一些以前不知道的功能,所以,整理出来与大分享。本文内容如下。 如何使用英文界面的jmeter 如何使用镜像服务器 Jmeter分布式测试 启动Debug 日志记录 搜索功能 线程之间传递变量 如何使用英文界面的JMeter Jmeter启动时会自动判断操作系统的locale 并选择合适的语言启动,所以,我们启动jmeter后,其会出现一个倍感亲切的中文界面。但由于jmeter本身的汉化工作做得不好,你会看到有未被汉化的选项及元件的参数。而且部分翻译并不准确,因此对于英文比较好的牛人来说更喜欢纯正的英文界面。 强制以英文方式启动jmeter的方法如下: 在windows环境下,打开jmeter解压目录,bin目录下的jmeter.bat文件,也就是jmeter程序的启动文件,选择记事本方式打开。做以下修改: ................. set HEAP=-Xms512m -Xmx512m set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m set SURVIVOR=-XX:SurvivorRatio=8 -XX:TargetSurvivorRatio=50% set TENURING=-XX:MaxTenuringThreshold=2 set RMIGC=-Dsun.rmi.dgc.client.gcInterval=600000 -Dsun.rmi.dgc.server.gcInterval=600000 set PERM=-XX:PermSize=64m -XX:MaxPermSize=64mset LOCALE=-Duser.language=en -Duser.region=rem set DEBUG=-verbose:gc -XX:+PrintTenuringDistribution ......... rem Server mode rem Collect the settings defined above set ARGS=%DUMP% %HEAP% %NEW% %SURVIVOR% %TENURING% %RMIGC% %PERM% %DDRAW% %LOCALE%............. 晕死,当我上面介绍了那么多后,在最新的2.8版本,我无意中发现了这个功能。 如何使用镜像服务器 在调试和修改测试计划的过程中,通常会为采样器增加一些额外的设置,例何设置额外的HTTP头、cookie管理器或认证管理器等,但当设置了这些内容后,sampler发出的请求是否就与预期的完全一支呢? 当然用户可以通过添加监听器来看查采样器发出的HTTP请求,但如果调试过程中并不想真正地把请求发送给被测应用,如何解决这个问题呢? Jmeter 提供了一个名叫HTTP Mirror Server的组件,HTTP Mirror Server可以启动一个镜像的服务器,该服务器把所有接收到的请求原封不动地返回,这样就可以看到发出请求的具体内容了。 添加HTTP Mirror Server的方式: 右键点击“工作台”--->非测试元件--->HTTP Mirror Server 如果有必要的话需要修改端口号,点击“启动”按钮来启动Server 。 接下来修改采样器,使其将HTTP请求 发送到localhost:8081(也就是Mirror Server启动的位置) 然后,运行测试计划,则可以从监听器“查看结果树”中看到响应数据。 JMeter分布式测试 Jmeter 是java 应用,对于CPU和内存的消耗比较大,因此,当需要模拟数以千计的并发用户时,使用单台机器模拟所有的并发用户就有些力不从心,甚至会引起JAVA内存溢出错误。为了让jmeter工具提供更大的负载能力,jmeter短小精悍一有了使用多台机器同时产生负载的机制。 那么,是如何实现多台负载机同时运行的呢?当然不会多个人坐在多台负载机面前,一喊开始,大家同时启动jmeter。这种方式很笨,也很难达到真正的同步。其实,我们通过单个jmeter 客户端就可以控制多个远程的jmeter服务器,使它们同步的对服务器进行压力测试。 通过远程运行jmeter,测试人员可以跨越多台低端计算机复制测试,这样就可以模拟一个比较大的服务器压力,一个jmeter客户端实例,理论上可以控制任意多的远程jmeter实例,并通过他们收集测试数据。这样一样,就有了如下特性: 保存测试采样数据到本地机器 通过单台机器管理多个jmeter执行引擎。 没有必要将测试计划复制到每一台机器,jmeter GUI客户端会将它发往每一台jmeter服务器。 每一台jmeter远程服务器都执行相同的测试计划,jmeter不会在执行期间做负载均衡,每一台服务器都会完整地运行测试计划。 在1.4G Hz~3GHz 的CPU 、1GB 内存的 JMeter 客户端上,可以处理线程 100~300。但是Web Service 例外。XML处理是 CPU 运算密集的,会迅速消耗掉所有的CPU 。一般来说,以XML技术为核心的应用系统,其性能将是普通Web 应用的 10%~25% 。另外,如果所有负载由一台机器产生,网卡和交换机端口都可能产生瓶颈,所以一个JMeter 客户端线程数不应超过 10 0 。 采用JMeter 远程模式并不会比独立运行相同数目的非GUI 测试更耗费资源。但是,如果使用大量的JMeter 远程服务器,可能会导致客户端过载,或者网络连接发生拥塞。 使用多台机器产生负载的操作步骤如下: (1)在所有期望运行jmeter作为 负载生成器的机器上安装jmeter, 并确定其中一台机器作为 controller ,其他的的机器作为agent 。然后运行所有 agent 机器上的jmeter-server 文件(假定使用两台机器192.168.0.100 和192.168.0.101 作为agent) (2)在controller机器的jmeter的bin目录下,找到jmeter.properties 文件,编辑该文件: 查找: remote_hosts=127.0.0.1 修改为: remote_hosts=192.168.0.100:1099,192.168.0.101:1099 这里要特别注意端口后,有些资料说明端口1644为jmeter的controller 和agent 之间进行通信的默认RMI端口号,但是在测试时发现,设置为1644运行不成功,改成1099后运行通过。另外还要留意agent的机子是否开启了防火墙等。 (3)启动controller 机子上的jmeter应用,选择菜单“运行”--->“远程启动”,来分别启动agent ,也可以直接选择“远程全部启动”来将所有的agent启动。 启动Debug 日志记录 大多数测试元件都支持Debug 日志记录。如果通过 GUI 运行测试计划,那么在选中测试元件后,可以通过“帮助”菜单enable debug或者disable debug。在“帮助”菜单 中有一个选项“What’s this node? ”, 通过它可以查看GUI 和测试元件的类名,如图 11 -7 所示。通过它们,测试人员可以决定修改哪一项JMeter 属性,以便修改日志级别。 例如:我们可以点击一个HTTP请求,选择菜单栏“帮助”--->what's this node ? 在jmeter的bin目录下,找到jmeter.properties 文件,关于日志级别的属性如下: Logging levels for the logging categories in JMeter. Correct values are FATAL_ERROR, ERROR, WARN, INFO, and DEBUG To set the log level for a package or individual class, use: log_level.[package_name].[classname]=[PRIORITY_LEVEL] But omit "org.apache" from the package name. The classname is optional. Further examples below. log_level.jmeter=INFO log_level.jmeter.junit=DEBUG log_level.jmeter.control=DEBUG log_level.jmeter.testbeans=DEBUG log_level.jmeter.engine=DEBUG log_level.jmeter.threads=DEBUG log_level.jmeter.gui=WARN log_level.jmeter.testelement=DEBUG log_level.jmeter.util=WARN log_level.jmeter.util.classfinder=WARN log_level.jmeter.test=DEBUG#log_level.jmeter.protocol.http=DEBUG For CookieManager, AuthManager etc:#log_level.jmeter.protocol.http.control=DEBUG log_level.jmeter.protocol.ftp=WARN log_level.jmeter.protocol.jdbc=DEBUG log_level.jmeter.protocol.java=WARN log_level.jmeter.testelements.property=DEBUG log_level.jorphan=INFO 搜索功能 这是在使用一个变量或含有一定的URL或参数测试计划树和元素有时很难找到。现在一个新的特点是从2.6开始,你可以访问它的菜单搜索。它提供了搜索与下列选项: 使搜索区分大小写区分大小写: 正则表达式是一个正则表达式搜索文本,如果有的话将被搜索的正则表达式树的组件,例如“ BTEST b”将匹配任何组件,包含测试组件的搜索元素 线程之间传递变量 JMeter 变量作用域局限于所属线程。这样设计是经过深思熟虑的,目的是让测试线程能够独立运转。有时候用户可能需要在不同线程间(可能属于同一个线程组,也可能不属于同一个线程组)传递变量。 其中一种方法就是使用属性。属性为所有 JMeter 线程所共享,因此当某个线程设置一个属性后,其他线程就可以读取更新后的值。 如果存在大量数据需要在线程间传递,那么可以考虑使用文件。例如,测试人员可以在一个线程中使用监听器,保存响应到文件(Save Responses to a file )或者 BeanShell PostProcessor 。而在另外一个线程中使用HTTP 采样器的“file: ”协议来读取文件,接着使用一个后置处理器或者BeanShell 测试元件提取信息。 如果在测试启动前测试人员就能获得测试数据,那么最好将数据保存到文件中,使用CSV Dataset读取。 这最后一个技巧,操作较为麻烦,暂时不给详细的例子。算是提供个思路吧!知道有这当子事儿就行了。日后有机会再实践!好啦,今天的分享到这里就结束了,如果需要更多的技术性文章,可以访问马哥教育官网欧!
巧用linux云服务器下的的/dev/shm/,避开磁盘IO不给力! 一.什么是tmpfs和/dev/shm/? tmpfs是Linux/Unix系统上的一种基于内存的文件系统。tmpfs可以使用您的内存或swap分区来存储文件。由此可见,tmpfs主要存储暂存的文件。它有如下2个优势: 1)动态文件系统的大小。 2)tmpfs 的另一个主要的好处是它闪电般的速度。因为典型的 tmpfs 文件系统会完全驻留在内存 RAM 中,读写几乎可以是瞬间的。 同时它也有一个缺点 tmpfs 数据在重新启动之后不会保留,因为虚拟内存本质上就是易失的。所以有必要做一些脚本做诸如加载,绑定的操作。tmpfs不具备持久性,重启后数据不保留,请务必注意!!! /dev/shm/是一个设备文件,它使用就是tmpfs文件系统(注意:在Centos和Redhat下,/dev/shm目录是一个链接,指向/run/shm目录,在Ubuntu系统下tmpfs文件系统对应的是/run/shm目录,可以使用df命令查看),因为 /dev/shm/这个目录不在硬盘上,而是在内存里,它就所谓的tmpfs。在Redhat/CentOS等linux发行版中默认大小为物理内存的一半。 比如我的的Red Hat Enterprise Linux Server 5.4 64(单核,512内存)分配内存为512M,所以/dev/shm为250M左右,查看/dev/shm如下: [root@AY1212111202285f63122 ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/hda1 20G 7.6G 11G 42% / tmpfs 250M 0 250M 0% /dev/shm tmpfs是基于内存的文件系统,创建时不需要使用mkfs等初始化。如我想把/dev/shm tmpfs大小改为512M,修改/etc/fstab的: tmpfs /dev/shm tmpfs defaults 0 0 改为 tmpfs /dev/shm tmpfs defaults,size=512m 0 0 然后执行mount -o remount /dev/shm [root@AY1212111202285f63122 ]# mount -o remount /dev/shm [root@AY1212111202285f63122 ]# df -h Filesystem Size Used Avail Use% Mounted on /dev/hda1 20G 7.6G 11G 42% / tmpfs 512M 0 512M 0% /dev/shm 怎么样,变成512M啦,使用很方便吧,重启也没有问题的,哈哈。当然在生产环境中你可以把内存加大些,反正现在内存很便宜啦,为了提高性能也需要将/dev/shm加大。 二.tmpfs(/dev/shm)的使用及应用场景 tmpfs是基于内存的,速度是不用说的,硬盘和它没法比。Oracle 中的Automatic Memory Management特性就使用了/dev/shm。另外如果在网站运维中好好利用tmpfs,将有意想不到的收获。我们先在/dev/shm建一个tmp目前,并与/tmp绑定。 [root@AY1212111202285f63122 ~]# mkdir /dev/shm/tmp [root@AY1212111202285f63122 ~]# chmod 1777 /dev/shm/tmp //注意权限 [root@AY1212111202285f63122 ~]# mount --bind /dev/shm/tmp /tmp [root@AY1212111202285f63122 ~]# ls -ld /tmp drwxrwxrwt 2 root root 40 May 29 21:46 /tmp 以下/tmp使用tmpfs文件系统的一些应用示例,一般tmpfs内存文件系统在做web缓存,cache,临时文件存储时会对web访问有很好的加速作用,从而提高网站访问的速度。 (1)将squid的缓存目录cache_dir放到/tmp下 vi /etc/squid/squid.conf 修改成 cache_dir ufs /tmp 256 16 256 这里的第一个256表示使用256M内存,重启一下squid服务,这样缓存目录都放在了tmpfs文件中了,速度不用说吧。 (2)将php的session文件放在/tmp下 对于一个访问量大的以apache php的网站,可能tmp下的临时文件都会很多,比如seesion或者一些缓存文件,那么你可以把它保存到tmpfs文件。保存seesion的方法很简单了:只要修改php.ini就行了,通过phpinfo测试文件查看你的php session存储位置,如果不在/tmp下,修改php.ini文件,修改如下: session.save_path = “/tmp” (3)将服务的socket文件放在/tmp下 如nginx.socket和mysql.sock 。 至于tmpfs的其他应用,我想大家可能通过这篇文章会有所启发。再次强调下:tmpfs 数据在重新启动之后不会保留,重启tmpfs 数据会丢失,所以有必要做一些脚本做诸如加载,绑定的操作!好啦,今天的分享到这里就结束了,如果需要更多的技术性文章,可以访问马哥教育官网!