Archive

Archive for March, 2012

Erlang节点互联失败原因分析以及解决方案

March 28th, 2012 6 comments

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: Erlang节点互联失败原因分析以及解决方案

今天和项仲在部署新系统的时候发现节点间ping不成功的情况,类似

1> net_adm:ping(‘xx@ip1’).
pang

由于这个问题比较普遍,我就记录下一步步的排除步骤.

首先从原理上分析下!由于erlang节点间通讯是透过tcp来进行的,所以我们确保以下几点:
1. 确保网络连接是通的,可以透过ping来查看。
2. 确保网络连接上tcp是可以通的,可以透过netcat在二个节点所在的机器上分别开个服务器端和客户端进行验证。
3. 确保端口是防火墙友好的。erlang的节点是登记在epmd服务上的,所以4369端口要能访问,其次节点的动态端口是可以访问的。

epmd -names
epmd: up and running on port 4369 with data:
name xx at port 46627

同样可以用netcat来验证。
4. erlang节点的cookie是一样的,可以透过setcookie来解决。

这几点确认无误后,就可以开始排查问题了。
首先交代下环境,二台机器IP分别是10.1.150.12,10.232.31.89, 上面分别运行Erlang版本R16B和R14B04,cookie统一设置为456789。
接着我们来演习下,首先我们10.1.150.12在节点A上起个节点’xx@10.1.150.12’,如下:

Read more…

Post Footer automatically generated by wp-posturl plugin for wordpress.

Linux TASK_IO_ACCOUNTING功能以及如何使用

March 11th, 2012 4 comments

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: Linux TASK_IO_ACCOUNTING功能以及如何使用

在过去我们了解系统IO的情况大多数是通过iostat来获取的,这个粒度只能精确到每个设备。通常我们会想了解每个进程,线程层面发起了多少IO,在Linux 2.6.20之前除了用systemtap这样的工具来实现是没有其他方法的,因为系统没有暴露这方面的统计。 disktop per设备per应用层面的IO读写统计,可以参考我之前写的,见这里.

透过lxr的代码确认,在Linux 2.6.20以后引入了TASK_IO_ACCOUNTING功能,通过把每个线程和进程的io活动通过/proc/pid/io导出大大方便了用户,这里需要注意的是RHEL 5U4基于2.6.18内核但是他们backport了这个功能,并由此催生了相应的了解per进程Io活动的工具如pidstat和iotop, 这两个软件工作的时候截图如下:

pidstat可以看到带层次线程IO活动


iotop能看到扁平线程IO活动

通过strace来了解到这二个软件关于IO活动部分输入源都是/proc/pid/io, 让我们来了解下这个文件:
Read more…

Post Footer automatically generated by wp-posturl plugin for wordpress.

Iostat看不到设备统计信息的原因分析

March 10th, 2012 2 comments

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: Iostat看不到设备统计信息的原因分析

最近在把玩些高速的SSD和nvram设备的时候,发现iostat无法统计到这些设备的信息,很是奇怪,于是分析和总结了一把,挺有意思的。

现象描述如下:

# uname -a
Linux dr4000 2.6.32-131.17.1.el6.x86_64 #1 SMP Wed Oct 5 17:19:54 CDT 2011 x86_64 x86_64 x86_64 GNU/Linux
# ls -al /dev/nvdisk0
brw-rw-r– 1 root root 252, 0 Mar 10 16:18 /dev/nvdisk0
# iostat -d
Linux 2.6.32-131.17.1.el6.x86_64 (dr4000) 03/10/2012 _x86_64_ (24 CPU)

Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 60.74 200.21 95.44 55171731 26299534

iostat很奇怪的看不到nvdisk0的IO统计信息.

开始我们的分析之旅,先简单的用strace看下iostat从那里读取这些统计信息的:
Read more…

Post Footer automatically generated by wp-posturl plugin for wordpress.

Categories: 工具介绍, 调优 Tags: ,

Linux下试验大页面映射(MAP_HUGETLB)

March 9th, 2012 3 comments

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: Linux下试验大页面映射(MAP_HUGETLB)

Linux对大页面内存的引入对减少TLB的失效效果不错,特别是内存大而密集型的程序,比如说在数据库中的使用。innodb引擎就支持大页面内存,具体使用可参见 这里

大页面更详细的资料可以参考: Documentation/vm/hugetlbpage.txt

过去使用大页面内存主要透过hugetlbfs需要mount文件系统到某个点去,部署起来很不方便,我们只想要点匿名页面,要搞的那么麻烦吗?
新的2.6.32内核通过支持MAP_HUGETLB方式来使用内存,避免了烦琐的mount操作,对用户更友好。

参见man mmap:

MAP_HUGETLB (since Linux 2.6.32)
Allocate the mapping using “huge pages.” See the kernel source file Documentation/vm/hugetlbpage.txt for further information.

这样明显会方便些,但是大内存页面预留的操作还是要做的,我们来演示下,先来准备环境:
Read more…

Post Footer automatically generated by wp-posturl plugin for wordpress.

Categories: Linux Tags: ,

Fio压测工具和io队列深度理解和误区

March 9th, 2012 43 comments

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: Fio压测工具和io队列深度理解和误区

Fio 是个强大的IO压力测试工具,我之前写过不少fio的使用和实践,参见 这里

随着块设备的发展,特别是SSD盘的出现,设备的并行度越来越高。利用好这些设备,有个诀窍就是提高设备的iodepth, 一把喂给设备更多的IO请求,让电梯算法和设备有机会来安排合并以及内部并行处理,提高总体效率。

应用使用IO通常有二种方式:同步和异步。 同步的IO一次只能发出一个IO请求,等待内核完成才返回,这样对于单个线程iodepth总是小于1,但是可以透过多个线程并发执行来解决,通常我们会用16-32根线程同时工作把iodepth塞满。 异步的话就是用类似libaio这样的linux native aio一次提交一批,然后等待一批的完成,减少交互的次数,会更有效率。

io队列深度通常对不同的设备很敏感,那么如何用fio来探测出合理的值呢?

让我们先来看下和iodepth相关的参数:

iodepth=int
Number of I/O units to keep in flight against the file. Note that increasing iodepth beyond 1 will not affect synchronous ioengines
(except for small degress when verify_async is in use). Even async engines my impose OS restrictions causing the desired depth not to be
achieved. This may happen on Linux when using libaio and not setting direct=1, since buffered IO is not async on that OS. Keep an eye on
the IO depth distribution in the fio output to verify that the achieved depth is as expected. Default:
1.

iodepth_batch=int
Number of I/Os to submit at once. Default: iodepth.

iodepth_batch_complete=int
This defines how many pieces of IO to retrieve at once. It defaults to 1 which
means that we’ll ask for a minimum of 1 IO in the retrieval process from the kernel. The IO retrieval will go on until we hit the limit
set by iodepth_low. If this variable is set to 0, then fio will always check for completed events before queuing more IO. This helps
reduce IO latency, at the cost of more retrieval system calls.

iodepth_low=int
Low watermark indicating when to start filling the queue again. Default: iodepth.

direct=bool
If true, use non-buffered I/O (usually O_DIRECT). Default: false.

fsync=int
How many I/Os to perform before issuing an fsync(2) of dirty data. If 0, don’t sync. Default: 0.

这几个参数在libaio的引擎下的作用,文档写的挺明白,但容我再罗嗦下IO请求的流程:

libaio引擎会用这个iodepth值来调用io_setup准备个可以一次提交iodepth个IO的上下文,同时申请个io请求队列用于保持IO。 在压测进行的时候,系统会生成特定的IO请求,往io请求队列里面扔,当队列里面的IO个数达到iodepth_batch值的时候,就调用io_submit批次提交请求,然后开始调用io_getevents开始收割已经完成的IO。 每次收割多少呢?由于收割的时候,超时时间设置为0,所以有多少已完成就算多少,最多可以收割iodepth_batch_complete值个。随着收割,IO队列里面的IO数就少了,那么需要补充新的IO。 什么时候补充呢?当IO数目降到iodepth_low值的时候,就重新填充,保证OS可以看到至少iodepth_low数目的io在电梯口排队着。

注意:这些参数在文档里面描述的有点小问题,比如说默认值什么的是不太对的,所以我的建议是这些参数要去显示的写。

如何确认fio安装我们的配置在工作呢? fio提供了诊断办法 --debug=io ,我们来演示下:

Read more…

Post Footer automatically generated by wp-posturl plugin for wordpress.

Categories: 工具介绍 Tags: , ,