分类 工具 下的文章

阿里云的磁盘IO真垃圾

今天在使用阿里云的虚拟服务器(VPS)的时候,用了一个命令find /user -type d | grep "xxx"。然后令人惊讶的是,就此停留在那里,一动不动没有动静。我等了几分钟,终于忍耐不住给Ctrl+C了。

难不成我这命令天赋异于常人,于是换了台服务器测了一下这个命令,三秒时间不到结果就出来了。那么到底是什么原因呢?

我就输入top命令查看一下CPU的占用情况,好家伙 wa 那一项的占用率达到了90%+。

使用man top找到了这一项的解释:wa, IO-wait : time waiting for I/O completion

原来命令卡的问题是IO啊,不行我得看看到底卡到什么程度了,使用time dd测速命令从服务器上拷一份数据,测个速。

额,使用time dd测出来的速度居然是正常的,大概30+M/s,虽然貌似慢了点,但是还是过得去的。首先排除大文件的读写问题!

那么我们来测测小文件的读写,这个实在没有找到工具,就找了一个小文件比较多的目录直接copy了。然后果然,同样的事情发生了,在其他服务器上三秒copy完的目录在这台机器上copy了两分钟。

所以问题很大概率确定了,小文件的读写IO有问题,而find的时候需要读很多小文件,结果速度超级慢。
正准备给阿里云发工单的时候,突然情况缓解许多,估计是因为宿主机其他机器的影响。

以前经常听说阿里云的服务器IO坑太多,自己没多少感觉,毕竟我也不在上面放什么应用。但是今天却给我当头一棒,连普通的命令都卡,或许我应该换个其他的云服务商了。

如何利用SSH进行端口转发

江苏电信的网络不太好,连接linode tokyo服务器比较卡。相比而言,我在阿里云华东区的服务器连接Linode要好很多(不过阿里云的磁盘IO性能太烂了,这个还得写一篇博客)。然后,如果能利用阿里云服务器做跳板的话,相信网络一定会好很多。

因为平时使用linode tokyo的机器只是用来进行谷歌搜索的,所以对带宽的要求不是很高。正常情况下使用SSH动态转发就能满足我的需求,但是偶尔卡卡卡让人心生不爽。因此,在此介绍一种使用SSH将阿里云当成跳板机的方法。但是切记ssh是单线程的,网速仅仅能够满足网页浏览的需求,如果有视频浏览等流量较大的需求,请使用ShadowSocks等工具。

SSH提供了一种叫做端口转发的功能,详细的介绍见此文《实战 SSH 端口转发》,原理就是跳板机将目标机器的端口转发到自己的某个端口上。我们需要使用到SSH的-L参数,我们来看看SSH是如何定义这个参数的用法的:

 [-L [bind_address:]port:host:hostport]

也就是说需要跳板机的地址,跳板机的端口,服务器的地址,服务器的端口。
在这边我们需要填入的是 0.0.0.0:2017:127.0.0.1:22。

然后该在客户机上如何访问跳板机呢?使用如下命令:

ssh xxx@xxx.xxx.xxx.xxx -D xxxx -p 2017

相信大家了解了解其中的几个xxxx的含义吧,这样我们就ssh连接上的其实是目标服务器的22端口。

Linux下如何查找某个目录下包含指定字符串的文件

本来我是记得这个查找某个目录下包含指定字符串的文件这个命令的,但是今天在使用的时候出现了一个严重的问题。这个问题以前也出现过,但是没什么影响就没有关注。但是这次我得解决这个问题!
我记得的命令是这样的:
find /path/to/directory -type f | xargs grep 'xxx'
但是一直会出现这种类型错误提示:.config/google-chrome/Default/Local:No such file or directory
怎么会这样呢?我仔细一看,沿着目录去找提示的文件,发现该名称的路径不存在,但是存在"Local XXX"这样的目录。
问题很明显了,是pipe(管道)传递时空格惹的祸,那么怎么解决这个问题呢?
我只能求助于搜索引擎了,使用关键词“Linux find xargs grep space”搜索,结果中有个stackoverflow的链接,标题是“How can I make xargs handle filenames that contain spaces?”。果然stackoverflow不愧是程序员的圣地之一,连这个都有。
排在前面的有几种方案,我试了
find /path/to/directory -type f -print0 | xargs -0 grep 'xxx'
这条命令搜索成功并且没有报错。
接下来,我该想想办法怎么把这个常用的搜索语句写成脚本方便以后使用了。

操作系统启动必经的几个过程

1、启动BIOS,BIOS是从一个ROM(只读存储)中启动的,里面是BIOS这个系统的机器码。
另外还有个可写的硬盘,叫做COMS,用来保存配置信息。
2、BIOS把控制权转交给MBR中的Bootloader,这里以GRUB为例子,会先启动MBR中的GRUB stage1程序。
为什么会分stage1和stage2,因为虽然它们都是GRUB的一部分,但是其实是两个程序。MBR中保存的是446Byte大小的Stage1程序,Stage1程序会调用/boot/grub/目录下的Stage2程序。
为什么会这么设计呢?还不是因为MBR中给Bootloader的空间太小,要想塞进一个完整功能的多重引导程序,是不可能的事情。
3、stage1程序把控制权交给stage2程序,stage2程序将会进行引导管理工作。
其实stage1只是个过渡,真正的工作还是看stage2的。
4、stage2程序开始载入kernel内核,并且载入initrd文件。

vim多文本编辑

vim中可以在一个vim session里面同时编辑多个文件,这个功能是基于ex行编辑器实现的,其中的核心命令是:buffers。

如何实现一个session里面编辑多个文件:
1、在编辑的时候在vim命令后面同时输入多个文件的名称
2、在vim的命令界面输入:e filename的方式添加一个文件

如何查看一个session里面的所有文件:
使用:buffers命令查看同一个session里面同时打开哪些文件。

如何在一个session不同文件之间进行切换:
切换到某个文件,使用:buffer(注意不带s)后面加上文件id(使用:buffers命令查得到)。
如果当前文件进行了修改,会提示你当前文件未保存,使用:buffer!后面加文件id就可以强制切换,vim会帮你保留当前修改的缓存。

当然,或许有些教程里面会教你使用:n和:N切换到下一个和上一个文件。
但是这些教程里面没有告诉你的是,当使用这两个命令的时候:
1)切换的范围只有编辑是位于vim命令后的几个文件名,不包括:e命令添加的新文件
2)切换的时候会重新读取一遍该文件,不会像:buffer 一样会自动保存缓存。