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, 超哥和韬哥飞越成功,我和猛哥的儿子的前途就全靠你俩了
写了好多,我发现我也太能墨迹了,不写了,回去睡觉了

CentOS配置NFS服务器的方法

最近搞KVM虚拟机迁移,前提是需要一个共享存储的文件系统来存储系统镜像,本来打算使用KFS来作为分布式文件系统的,但是在修改kvm的镜像读写API后,系统是跑起来了,但是奇慢无比,主要是存在对镜像存在大量的随机读写造成的,这个下次再好好总结下。所以就想到了简单易用的NFS文件系统,下面是具体的配置细节:

1,NFS服务器的安装

在CentOS系统中,默认情况下已经安装了NFS文件系统,如果没有安装就需要手工安装了

#rpm –q nfs-utils portmap

2, 查看NFS是否启动

#service nfs starus
#service portmap status

3,启动NFS

#service nfs start
#service portmap status

更多 >

C语言调用C++库接口的方法概述

最近需要在由纯c语言编写的代码中调用C++的动态库,在网上找了一些资料,现在总结下解决方法。

主要的思想就是将C++的动态库再封装一层,在这一层编写C语言的函数api,这API中使用C++动态库提供的类;

具体例子如下:

1,假如C++动态库包含如下代码:
//myclass.h

#ifndef _MYCLASS_H
#define _MYCLASS_H
class MyClass
{
    public:
        void print();
};
#endif

//myclass.cc

#include <iostream>
#include "myclass.h"
using namespace std;
 
void
MyClass::print()
{
    cout < < "MyClass::print() called" << endl;
}

编译链接生成动态库:libmyclass.so
g++ myclass.cc -shared -o libmyclass.so -I./ -fPIC

更多 >

使用事件驱动模型实现高效稳定的网络服务器程序【写得比较基础详细】

前言

事件驱动为广大的程序员所熟悉,其最为人津津乐道的是在图形化界面编程中的应用;事实上,在网络编程中事件驱动也被广泛使用,并大规模部署在 高连接数高吞吐量的服务器程序中,如 http 服务器程序、ftp 服务器程序等。相比于传统的网络编程方式,事件驱动能够极大的降低资源占用,增大服务接待能力,并提高网络传输效率。

关于本文提及的服务器模型,搜索网络可以查阅到很多的实现代码,所以,本文将不拘泥于源代码的陈列与分析,而侧重模型的介绍和比较。使用 libev 事件驱动库的服务器模型将给出实现代码。

阻塞型的网络编程接口

几乎所有的程序员第一次接触到的网络编程都是从 listen()、send()、recv() 等接口开始的。使用这些接口可以很方便的构建服务器 / 客户机的模型。

我们假设希望建立一个简单的服务器程序,实现向单个客户机提供类似于“一问一答”的内容服务。
图 1. 简单的一问一答的服务器 / 客户机模型
图 1. 简单的一问一答的服务器 / 客户机模型

我们注意到,大部分的 socket 接口都是阻塞型的。所谓阻塞型接口是指系统调用(一般是 IO 接口)不返回调用结果并让当前线程一直阻塞,只有当该系统调用获得结果或者超时出错时才返回。

实际上,除非特别指定,几乎所有的 IO 接口 ( 包括 socket 接口 ) 都是阻塞型的。这给网络编程带来了一个很大的问题,如在调用 send() 的同时,线程将被阻塞,在此期间,线程将无法执行任何运算或响应任何的网络请求。这给多客户机、多业务逻辑的网络编程带来了挑战。这时,很多程序员可能会 选择多线程的方式来解决这个问题。

更多 >

Google创新论坛

WPO[Web 性能优化与运维]会议链接

http://velocity.oreilly.com.cn/index.php?func=slidesvideos

保存下链接,后续好好听下~