Archive

Author Archive

vmtouch-系统pagecache查看和操纵器

December 8th, 2011 4 comments

今天看到dbanote这篇博文介绍的技术清单,里面列到了很多有意思的技术。其中提到了一个小工具vmtouch,主页见这里

vmtouch – the Virtual Memory Toucher
Portable file system cache diagnostics and control
vmtouch is a tool for learning about and controlling the file system cache of unix and unix-like systems. It is BSD licensed so you can basically do whatever you want with it.

我之前写过不少之类的博文,但是基本都是用systemtap,工具也零碎,现在vmtouch比较系统的把功能整合在一起,源码写的虽然简单,但是用到了还是挺管用的。

顺手贴了下vmtouch的使用:
Read more…

Categories: Linux, 工具介绍 Tags: ,

Erlang虚拟机内存使用问题以及监控

December 6th, 2011 2 comments

Erlang虽然号称N个9的稳定性,但是在实际使用中还是有很多机会看到Erlang Crash了的,其中和VM相关的Crash 十有八九是由于内存使用过量,导致系统服务分配内存导致的。Erlang的内存分配测量是集中批发,零售给各个VM部件,包括用户进程和ETS数据库等内存消费大户。VM的内存增长是以fib方式上升的,一旦你的内存使用到G级别,那么之后的大量内存分配会以超过你预想的速度消费。

其中用户进程的消息队列是其中的罪魁祸首。 Erlang的虚拟机实现和设计上都没有阻止用户往一个进程的消息队里面扔消息,当消息的生产速度过快,超过进程的处理能力,这些消息就堆积起来,占用越来愈多的内存,最终导致VM崩溃。

那么我们如何来避免这种事情呢?既然不能阻止,那我们绕着走,通过监控来避免:
1. 监控消息队列的增长。
2. 监控VM整个内存的使用量。
Read more…

Categories: Erlang探索 Tags: , ,

关于ramdisk

December 5th, 2011 Comments off

ramdisk是Linux内核带的一个以内存为后备的虚拟设备,以块设备方式提供。 具体功能参见Documentation/ramdisk.txt,代码参见drivers/block/brd.c.

内核在启动的时候会预设几个ramdisk, 初始大小通常为128K的块设备,方便有需要的用户。

$ uname -r
2.6.32-131.0.15.el6.x86_64
$ ls /dev/ram0 -al
brw-rw---- 1 root disk 1, 0 2011-12-02 11:41 /dev/ram0
$ sudo blockdev --getsize /dev/ram0
131072

在实践中ramdisk有如下几个用途:
1. ramdisk的代码写的非常简洁,很容易让你明白块设备如何编写。
Read more…

Categories: Linux, 工具介绍 Tags:

lscpu – CPU architecture information查看器

December 5th, 2011 Comments off

很多时候我们要了解CPU的型号,NUMA架构, L1,L2,L3 Cache大小等信息, 为服务器程序的编写和设置做决策。
Linux下除了 /proc/cpuinfo提供的信息以外,还有intel自己的工具: 参间 CPU拓扑结构的调查: http://blog.yufeng.info/archives/666

但是这些都不是很方便, 同样来自util-linux-ng包的lscpu很清晰的告诉你上面的信息. RHEL 6.1 已经预先安装好了。

man lscpu

DESCRIPTION
lscpu gathers CPU architecture information like number of CPUs, threads, cores, sockets, NUMA nodes, information about CPU caches, CPU family,
model, bogoMIPS, byte order and stepping from sysfs and /proc/cpuinfo, and prints it in human-readable format. It supports both online and
offline CPUs. Alternatively, it can print out in parsable format including how different caches are shared by different CPUs, which can also be
fed to other programs.

我们来演示下:

$ uname -r
2.6.32-131.0.15.el6.x86_64
$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                16
On-line CPU(s) list:   0-15
Thread(s) per core:    2
Core(s) per socket:    4
CPU socket(s):         2
NUMA node(s):          2
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 44
Stepping:              2
CPU MHz:               2394.164
BogoMIPS:              4787.83
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              12288K
NUMA node0 CPU(s):     0,2,4,6,8,10,12,14
NUMA node1 CPU(s):     1,3,5,7,9,11,13,15

numa什么的在那里分布很清晰,赞下!

祝玩得开心!

Categories: Linux, 工具介绍 Tags: ,

Linux下方便的块设备查看工具lsblk

December 5th, 2011 3 comments

之前在Linux下看有什么块设备,通常都用fdisk什么的或者直接ls /dev/ 人肉去看看, 很土,不方便。 前二天在江枫的网站上看到了介绍的lsblk,这玩意不错,推荐给大家。
这个工具属于util-linux-ng包,在RHEL 6.1上是安装好的啦,直接用就好。 ubuntu高版本下也有。

这个工具最大的特别是把所有的块设备列出,而且还能显示他们之间的依赖关系,演示下:

$ uname -r
2.6.32-131.0.15.el6.x86_64
$ lsblk
NAME   MAJ:MIN RM   SIZE RO MOUNTPOINT
sda      8:0    0   931G  0 
├─sda1   8:1    0   128M  0 /boot
├─sda2   8:2    0   3.9G  0 /
├─sda3   8:3    0     2G  0 [SWAP]
├─sda4   8:4    0     1K  0 
├─sda5   8:5    0   9.8G  0 /usr
├─sda6   8:6    0   9.8G  0 /var
├─sda7   8:7    0   3.9G  0 /opt
├─sda8   8:8    0   3.9G  0 /tmp
└─sda9   8:9    0 897.6G  0 /home
sdc      8:32   0 148.5G  0 
└─md0    9:0    0   594G  0 /u01
sdd      8:48   0 148.5G  0 
└─md0    9:0    0   594G  0 /u01
sde      8:64   0 148.5G  0 
└─md0    9:0    0   594G  0 /u01
sdb      8:16   0 148.5G  0 
└─md0    9:0    0   594G  0 /u01
sr0     11:0    1  1024M  0 

看出来md0依赖于sdb, sdc,sdd,sde, 而sda1依赖sda,很爽!

祝玩得开心!

Categories: Linux, 工具介绍 Tags: ,

巧用Netcat方便网络程序开发

December 5th, 2011 4 comments

首先介绍下NC,这个号称网络瑞士军刀的工具。

What is Netcat?

Netcat is a featured networking utility which reads and writes data across network connections, using the TCP/IP protocol.
It is designed to be a reliable “back-end” tool that can be used directly or easily driven by other programs and scripts. At the same time, it is a feature-rich network debugging and exploration tool, since it can create almost any kind of connection you would need and has several interesting built-in capabilities.

It provides access to the following main features:

* Outbound and inbound connections, TCP or UDP, to or from any ports.
* Featured tunneling mode which allows also special tunneling such as UDP to TCP, with the possibility of specifying all network parameters (source port/interface, listening port/interface, and the remote host allowed to connect to the tunnel.
* Built-in port-scanning capabilities, with randomizer.
* Advanced usage options, such as buffered send-mode (one line every N seconds), and hexdump (to stderr or to a specified file) of trasmitted and received data.
* Optional RFC854 telnet codes parser and responder.

项目主页:http://netcat.sourceforge.net/
Wiki: http://en.wikipedia.org/wiki/Netcat

再看下我们如何使用NC:
在RHEL服务器里面NC是标配,无需用户自己安装,手册也很全 man nc就好了。

之前在开发服务端程序的时候经常用nc来发报文,模拟客服端的行为, 省的自己写个客户端的麻烦,比如:

$ echo -n "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80
$ nc [-C] localhost 25 << EOF
HELO host.example.com
MAIL FROM: <user@host.example.com>
RCPT TO: <user2@host.example.com>
DATA
Body of email.
.
QUIT
EOF

这二天从鸣嵩那里学了招模拟服务端的行为, 在调查自己的客户端的时候很方便,来看下:

#模拟服务端
$ nc -l 1234
hello
#模拟客户端
$ nc 127.0.0.1 1234
hello

NC还有其他的功能,读者自己来挖掘!

祝玩得开心!

Categories: Linux, 工具介绍 Tags:

gen_tcp接受链接时enfile的问题分析及解决

December 5th, 2011 1 comment

最近我们为了安全方面的原因,在RDS服务器上做了个代理程序把普通的MYSQL TCP连接变成了SSL链接,在测试的时候,皓庭同学发现Tsung发起了几千个TCP链接后Erlang做的SSL PROXY老是报告gen_tcp:accept返回{error, enfile}错误。针对这个问题,我展开了如下的调查:

首先man accept手册,确定enfile的原因,因为gen_tcp肯定是调用accept系统调用的:

EMFILE The per-process limit of open file descriptors has been reached.
ENFILE The system limit on the total number of open files has been reached.

从文档来看是由于系统的文件句柄数用完了,我们顺着来调查下:

$ uname -r
2.6.18-164.el5
$ cat /proc/sys/fs/file-nr 
2040    0       2417338
$ ulimit -n
65535

由于我们微调了系统的文件句柄,具体参考这里 老生常谈: ulimit问题及其影响, 这些参数看起来非常的正常。
先看下net/socket.c代码:
Read more…