2011年一月

linux监控程序-程序自动重启方法

大家在写server的时候,不管server写的是多么健壮,还是经常出现core dump等程序异常退出的,但是一般情况下需要在无人为干预情况下,能够自动重新启动,保证server程序能够服务用户。这时就需要一个监控程序来实现能够让程序自动重新启动,现在笔者在写portmap就遇到了这个问题,通过网上查找资料,找到了一个相对靠谱的exec+fork解决方法。

使用脚本实现自动重启

首先想到的最简单的使用shell脚本,大概思路:

ps -ef | grep “$1″ | grep -v “grep” | wc –l 是获取 $1 ($1 代表进程的名字)的进程数,脚本根据进程数来决定下一步的操作。通过一个死循环,每隔 1 秒检查一次系统中的指定程序的进程数,这里也可使用crontab来实现。

这种方法比较土,还是可以基本解决问题,但是有1s的延迟,笔者在应用中未采用这种方法,有关这个shell脚本,请参看文章后面的附件代码。

exec+fork方式

笔者最终采用的exec+fork方式来实现的,具体思想如下:

1,exec函数把当前进程替换为一个新的进程,新进程由path或file参数指定。可以使用exec函数将程序的执行从一个程序切换到另一个程序;

2,fork函数是创建一个新的进程,在进程表中创建一个新的表项,而创建者(即父进程)按原来的流程继续执行,子进程执行自己的控制流程;

3,wait 当fork启动一个子进程时,子进程就有了它自己的生命周期并将独立运行,我们可以在父进程中调用wait函数让父进程等待子进程的结束;

相信介绍到这里,读者已经能够想到解决方法了:1)首先使用fork系统调用,创建子进程,2)在子进程中使用exec函数,执行需要自动重启的程序,3) 在父进程中执行wait等待子进程的结束,然后重新创建一个新的子进程。

更多 >



arch

端口映射工具portmap 0.1版本发布

项目地址:http://code.google.com/p/portmap/

下载地址:http://portmap.googlecode.com/files/portmap-0.1.tar.gz

项目介绍:

portmap 主要是作为各个机器间端口映射的工具
项目的最初目的是作为vnc端口映射,主要是将不同机器的vnc接口映射到一台能够对外的
物理机上,安全和方便管理;
iptables可以实现端口映射,但是每次增加一个映射端口都需要重新启动,故自己动手完成了端口映射工具;
还有像80端口的映射,这个可以归总为反向代理,作为负载均衡器来使用,原理是相通,像nginx七层的负载均衡功能应该使用的就是端口映射,portmap暂时不支持哈~

特点:

* 使用epoll方式,支持高并发和长连接模式
* 多线程支持,线程个数可配置,主要作为工作线程
* 使用简单,只需发送待映射的端口到守护进程,守护进程会返回映射后的端口,即可使用
*

TODO:

* 配置文件单独提取出来
* bug修复
* 多机扩展?

Example:

$ make
$ ./portmap  //启动进程
$ cd test    //修改test1.c中相关变量
   //addr: portmap server的地址
  //port: portmap server 的端口
  //request:是需要映射的地址和端口
const char *addr = "10.60.1.124";
unsigned int port = 5903;
 
const char *request = "10.60.1.124:5905";
make && ./test1

正常情况下,返回映射后的地址和端口



gdb 调试多进程程序方法

今天在用gdb调试sheepdog时,在程序fork出子进程后,整个gdb程序就退出了,无法继续跟踪,网上找了半天找到了解决方法.

解决方法:

设置detach-on-fork参数

set detach-on-fork [on|off]

  • on: 断开调试follow-fork-mode指定的进程。
  • off: gdb将控制父进程和子进程。follow-fork-mode指定的进程将被调试,另一个进程置于暂停(suspended)状态

将detach-on-fork 设置为off即可

跟踪子进程的方法:

默认情况下,gdb会继续跟踪父亲进程,无法对子进程进行调试

设置follow-fork-mode可以解决这个问题

follow-fork-mode的用法为:

set follow-fork-mode [parent|child]

  • parent: fork之后继续调试父进程,子进程不受影响。
  • child: fork之后调试子进程,父进程不受影响。
(gdb) set follow-fork-mode child

本文地址:http://www.yaronspace.cn/blog/index.php/archives/1072



KVM分布式共享存储解决方案-sheepdog

介绍

今天在调研分布式文件系统时,非常偶然的机会看到sheepdog ,然后接着又看到KVM这个关键字,让我异常兴奋,这不是我一直在找的KVM镜像存储的分布式存储系统吗,原来KVM/Qemu最近已经开始对其进行了开发,并在Qemu 0.13.0版本后加入了与sheepdog的支持,太佩服国外的开源贡献者。

sheepdog(牧羊犬) 官方网站:http://www.osrg.net/sheepdog/

Sheepdog is a distributed storage system for KVM. It provides highly available block level storage volumes that can be attached to KVM virtual machines. Sheepdog scales to several hundreds nodes, and supports advanced volume management features such as snapshot, cloning, and thin provisioning.

安装步骤

1,环境准备

corosync-1.3.0.tar.gz sheepdog-0.2.0.tar.gz

2,安装corosync

corosync 是linux 集群管理的引擎,具体请参看官网

$ tar -xzvf  corosync-1.3.0.tar.gz
$ cd corosync-1.3.0
$ ./autogen.sh
$ ./configure
$ sudo make install

3,qemu 0.13的安装 (略)

4,sheepdog安装

$ tar -xzvf sheepdog-0.2.0.tar.gz
$ cd sheepdog-0.2.0
$ ./autogen.sh
$ ./configure
$ sudo make install

这时可能会出现linux/signalfd.h 这个文件找不到,以及后续会出现signalfd undefined reference 的错误,我的系统是CentOS ,出现了这种错误,出现这种情况的话,我简单的解决方法是对signalfd进行模拟,这点我参考了qemu的有关实现,
具体是在sheep/work.c中加入以下代码:
代码太长,我贴到最后了,请参看附件

5,sheepdog的具体使用

1> 配置/etc/corosync/corosync.conf
mv /etc/corosync/corosync.conf.example /etc/corosync/corosync.conf
同时修改,bindnetaddr字段为自己的ip地址,mcastaddr(怎么修改暂时不清楚,应该是广播的地址,保持默认值即可)
2> 启动corosync
# corosync {注:需要是root账户}
3> 如果是ext3文件系统,需要加入user_xattr

     mount -o remount,user_xattr /

4> 启动Sheep

      # sheep ~/store_dir  <span style="color: #ff6600;">#不能是相对路径,相对路径会出错</span>
      # collie cluster format --copies=3

5> 查看状态

      # collie node list
      # collie cluster info
      # colli vdi list

6> 创建镜像

        # qemu-img create sheepdog:Alice 256G
        # qemu-img convert ~/amd64.raw sheepdog:Bob

不过我在Convert时一直提示不成功,error while writing
查找原因:通过查看sheep.log日志文件,可以发现时由于Too Many open files 错误提示,原来是打开太多文件所造成的,因为sheepdog对文件进行4M进行分片的,这样会导致大量的文件打开,而一般的系统进程最多的文件数是1024 所以就这个错误!
解决方法:ulimit -n 4096 {或者更大的值} 这样修改只是在目前会话中有效,需要长久生效,请参看这篇文章

总结

sheepdog作为一个新的项目,感觉还是挺不错的,刚好弥补了开源虚拟化中有关镜像存储的问题,为后续的虚拟机迁移做准备,目前sheepdog暂时还未支持migrate ,不过看它的TODO LIST 下一步已经开始做了,系统能够尽快做出来,下一步主要是看下它的源码,因为很多地方会出现诡异的错误的,还需要解决呀!

更多 >



KVM虚拟机在物理机间的迁移方法

有关虚拟机间的动态迁移,我在虚拟机迁移技术漫谈 对它进行大概的介绍,现在结合今天我自身的实践,来具体解释下迁移的步骤;

1,环境准备

1) 共享存储-NFS: 理论上来说,需要迁移的虚拟机可以不适用共享存储,但是如果不用共享存储的话,在迁移的过程中就需要对镜像进行大量的拷贝,这个是非常耗时的,而且在大量的集群的情况下,基本上镜像都是存放在分布式的共享存储中,一是方便管理,一是为虚拟机的动态迁移做准备,有关NFS的使用和挂载,请参看我的另外一篇文章
CentOS配置NFS服务器的方法
2) 支持kvm迁移的qemu-kvm 和 kvm模块:我用的是最新的qemu-kvm-0.13.0.tar.gz ,而kvm模块,由于我的系统的内核版本过低,用的kvm-88中的kvm-intel.ko kvm.ko模块

2,启动kvm虚拟机

在下面的介绍中使用 源虚拟机是待迁移的虚拟机,目的虚拟机是迁移后的虚拟机
源主机的启动命令如下:

   ./qemu-system-x86_64 -m 512 -hda /home/yangguang/nfs_mnt/images/debian_lenny_i386_small.qcow2 -net tap -net nic,model=rtl8139 -vnc :1 -monitor stdio
    #解释说明:
     1,  /home/yangguang/nfs_mnt: 代表NFS挂载的目录
     2,  -monitor stdio  将控制台定向的标准输入输出(这个是虚拟机迁移必须的,因为后续需要在命令行中进行操作)

目的虚拟机的启动命令:

    ./qemu-system-x86_64 -m 512 -hda /home/yangguang/nfs_mnt/images/debian_lenny_i386_small.qcow2 -net tap -net nic,model=rtl8139 -vnc :1 -monitor stdio -incoming tcp:0:8888
     #解释说明
     1,  启动命令参数必须和源虚拟机的启动参数是一样的,包括网卡类型等
     2,  -incoming tcp:0:8888 这个是在端口8888接收迁移命令和数据

这时在命令行中输入

     info status

源虚拟机显示的状态是running
目的虚拟机的显示的状态时paused

更多 >



12934473758454

一年又一年

今天已经是2011年,真的感觉时间过的好快呀,转眼的功夫一年又过去了,每个人都需要停下脚步,回过头看看这一年的得与失,真的需要好好总结下了。
看到我的去年的总结,还是有种很亲切的感觉,没事写写平时的感受其实还是挺好的,可惜总是贴一些技术的文章,个人的想法的东西去想的还是太少(可能是性格的因素的吧,不希望把一些比较内心的想法表达出来),这个其实真的还是蛮好的,争取2011年能够写一些。
简单的列下流水账吧,太有文采的文字也写不出来
1,今年开学直到九月份一直在百度实习,实习是瞒着老板偷偷地出去的,时间还是挺紧凑的,还得正常去实验室,只能利用上课的时间去公司,基本上研一下半年没有上过课,不过最后还好,课程都过了,呵呵!其实本来没有打算出去实习的,真的想好好利用研究生的时间搞搞科研,正像在Google面试那个工程师所说的那样,既然读了研究生,就应该做一些与正常本科毕业就工作的不一样的事情,如果研究生三年就是再外面实习三年,虽然最后也可能找到很好的工作,但肯定还不如直接工作三年来的更直接一些呢,所以研究生就应该做一些研究生应该做的一些事,比如读读paper、写写论文啥的等;但是我最后还是选择出去实习,主要原因是原来跟着老板做的东西不感兴趣,不能就这样荒废三年对吧,而且我觉得我不是能够主动去学习的那种,需要某种需求进行推动我,我才会去看它学习它的,所以就偷偷摸摸的在百度实习了将近半年。
总的来说,在百度这半年还是挺开心的,挺有收获的,主要参与了Baidu App Engine 项目主要开发工作,因为这个项目是比较新的项目,当时去的时候,加我一共三个人,能够接触比较多的东西,从前端到最后端,而且对整个架构也理解的比较清晰,后来陆续又来了两个同事,这项目在百度内部目前发展的比较好,有个比较有意思的小插曲:当时我将近实习结束,我的mentor居然劝我退学,放弃读硕士,直接工作,并且拿出自己当例子说事(他是硕士毕业,但是我们的项目老大是本科毕业,而且比他还低一届),可惜我最后还是乖乖的回所继续干活了,哈哈~最后还是感谢chuanying,xiaowei还有dongfei zhangyong这些同学的,从你们身上学到了很多!
2,到九月份时,就乖乖的回实验室了,开始了我的正常的研究生生涯,到现在也将近三四个月了,做了一些东西,包括对KFS的改造,有关KVM虚拟机的学习等,这期间我居然开始修改内核代码了,这个是最难以置信的,不过还是太弱了,本科时学的体系结构和微机技术的知识基本上全忘没了,还得从头回忆,但是还真没觉得这个东西能够用到,但是看论文太少,自己的独立思考还太弱了。
3,生活上,十一的时候去了趟大城市铁岭,看望下丈母娘,话说这男女方如果不在同一个地方,真是比较麻烦,下次去不知道得等到啥时候,这结婚后就更纠结了,希望xiaofang同学看到不要有啥想法哦~
同时也给超哥、猛哥和韬哥提醒一声,找对象尽量都找近一点哦

2011年的期望:
1,祝愿小邓同学早日实现她的梦想

2,好好干活与学习,明年找个好工作
3,希望lc lm zt (对号入座)不再寂寞不再mensao, 猛哥也越nb, 超哥和韬哥飞越成功,我和猛哥的儿子的前途就全靠你俩了
写了好多,我发现我也太能墨迹了,不写了,回去睡觉了