免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1577 | 回复: 0
打印 上一主题 下一主题

最近的一些工作 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-09-26 12:52 |只看该作者 |倒序浏览

973项目验收终于落下帷幕,如释重负,终于可以清闲一段时间,趁现在还清醒,把最近的工作做个总结。
关于试验平台的搭建
由于后来系统对聚合带宽要求提高了很多,而dnfs系统的性能提升空间已经很少了,及时想到办法,时间也来不及了,所以只能通过扩大系统的规模来提高聚合带宽了,曹sir下令将机房B区都整出来跑dnfs,于是从连线,装机,服务配置等一大堆问题都出来了。
最开始,yj在B去的几台机子上通过clonezilla已经装了几台机子(包括ubuntu和windows),我对ubuntu一直没什么好感,用过几次ubuntu都感觉不好。用redhat时间长了,人也变懒了,redhat DVD的镜像包含大部分你可能需要的软件包,你只需要安装的时候选上就Ok了,但这样学东西的机会就少了(最近想装个gentoo玩下),感觉redhat很适合于机房的环境。后来跟cj商量了下,决定把机器上都装redhat(当时的想法是想为了以后实验的方便,并且到时候跑dnfs不会有很多问题)。
于是开始刻碟(rhel5),安装到一台机器上(装的时候把光驱放置反了,托盘一直弹不出来,非常之郁闷),然后用clonezilla做镜像挂到192.168.1.1机器上,然后通过U盘系统启动使用clonezilla到1.1上恢复备份的数据到本地硬盘,由于clonezilla是全盘的备份包括mbr,所以拷贝过来的系统直接可以使用,除了网卡的名字会由eth0变成eth1,因为原来系统网卡的条目通过clonezilla被拷贝过来,但系统启动时,发现拷贝过来的网卡信息(网卡mac地址)与当前系统网卡的mac地址不同,也就无法启动该网卡,通过udev管理,系统发现了当前系统的网卡,于是将其命名为eth1,并与其mac相关联,这些信息在/etc/udev/rules.d/*net*文件中。如果想把网卡名恢复为eth0,可以将该文件中eth0(实际上是远端系统的条目)删掉,将本机网卡条目的名字改为eth0即可。
当天晚上(貌似是9月1号通宵加班),我和yj装了大概10多台,其他的人一部分做网线,一部分布线,终于把机房整得像个样子了。(后来B区的机子好像都是有lxy和lxh装的)
但事情并没有想象中的那么顺利,在装系统的时候我选了xen服务(支持虚拟化),导致这批redhat启动会很慢(看了下,主要是启动xen服务启动时间较长),让人非常之郁闷,而且在网上看了下说停掉xen服务机器可能不能正常启动,也没敢动(有点后悔,准备抽个时间试一下)。
系统弄好后就是把网络配通了,网络需求是将B区设置在一个局域网环境,由一个节点做网关(192.168.1.1),连接到外网,然后通过网关做端口映射使得实验室能够访问到该局域网内其他的机器,当天晚上接准备把已经装好系统的机子的网络都配好,以方便第二天的实验于是
#ifconfig ethx 192.168.1.x netmask 255.255.255.0
#route add default gw 192.168.1.1
#ping 192.168.1.1      
接着把启动项改成redhat(使用的是ubuntu的grub),但重启后系统并没有进入redhat(第五项),而是直接进ubuntu(第一项),之后重启几次都是这样,于是想改用redhat的grub试下,是否是引导的问题。
#grub
$find /boot/grub/stage1
     (hd0,1)  //ubuntu装在/dev/sda2上
     (hd0,4)  //redhat 装在/dev/sda5上
$root (hd0, 4)  
$setup (hd0)  //将(hd0,4)上的grub写入到mbr
重启后redhat还是进不去(grub后一会就自动重启了),更糟糕的是ubuntu也进不去了,提示unrecongnized file or directory,是因为redhat企业版的grub(版本比较老)不能识别ubuntu的文件系统(据yj说在08年ext3被改过),于是找了张ubuntu较新的live cd进光盘系统重新把ubuntu的grub写到mbr,此时已经是晚上12点多了,匆匆的将其他机子的网络都配好后睡觉了。
第二天,lx带来了不好的消息,说配置的网络信息重启后都失效,需要重新配置,查了下,原来ifconfig,route所配置的信息只是供临时的实验所用,要想配置消息永久生效,有三种方法:
使用各个linux发行版所带的配置工具,如redhat的setup
将网络配置信息写到配置文件中。
redhat为/etc/sysconfig/network-scripts/ifcfg-ethx,ubuntu为/etc/network/interfaces
一个redhat的例子
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.1.X
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
配置命令写到开机会加载的脚本中,如/etc/rc.local
局域网连通后,接下来就是网关连外网的问题了,需要通过mystar认证才能上网(华工的校园网),之前和cj使用mystar时,到白云down了一个mystar,结果一直提示serching for server,仔细检查了mystar的配置文件,用户名,密码,网卡信息(其他还有自动重连等选项)都没错,后来在yj的帮助下把问题解决了,原来我down到的是一个比较老的mystar,新的mystar配置文件要拷贝到/etc/mystar.conf。
插曲:一次配置网关的两块网卡的信息时,把角色搞反了,主要是当时错误的“确定”连外网的是个千兆卡,然后通过ethtool查看,将千兆卡设为外网ip,结果一直不通,当时把千兆卡的ip改为内网通过,但当时的思想太固化了,根本没想到会把两块网卡的角色弄反了。
能连通外网了,该配置iptables了,主要需要达到两个目的:机房的节点能够访问外网,实验室能够访问到机房每个节点的服务(主要是ssh)。前者需要配置nat,后者则通过端口映射完成。
更改所有来自192.168.1.0/24的数据包的源ip地址为1.2.3.4:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 1.2.3.4 //snat
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i eth1 -j DNAT --to 1.2.3.4  //dnat
前者先进行nat,在进行路由和过滤;后者先进性路由和过滤再进行nat;

iptables -t nat -A PREROUTING -d 202.114.6.63 -p tcp --dport 6422 -j DNAT --to 192.168.1.64:22
将访问202.114.6.63:6422请求映射到192.168.1.64:22(内网机器的ssh)
这样实验室就可以通过6422端口访问到机房192.168.1.64机器。

   

关于dnfs的安装
基本的系统搭建完成后,需要开始安装dnfs了,安装dnfs需要先安装fuse,fuse是一个用户空间的文件系统,包含一个fuse内核模块,fuse用户空间空间库,以及一个mount工具。
问题出现了,以前一直用的fuse-2.7.0,sf上提供的包包含了完整的三部分,后来fuse从2.8开始支持了大于4k的写请求(在不修改内核的情况下达到128k),同时内核模块加入到内核源码中,所以fuse2.8就只包含了user lib和mount tool,而为了提高系统的性能,我们又需要fuse支持大写的请求。
B区机器的系统有两种,ubuntu(kernel 2.6.28, 包含了fuse-2.7.3),rhel(kernel 2.6.15)。所以针对rehl,需要先安装fuse-2.7(主要是添加内核模块,fuse的三部分不能分开安装),然后安装fuse2.8(必须安装在相同目录),将2.7的用户lib覆盖掉,原来指向libfuse.so.2.7.0的软链接lib.so会指向fuse.so.2.8.0,从而支持big_writes选项。
   针对ubuntu,只需要安装fuse-2.8,但安装后,dnfs还是链接接到了/lib下的libfuse.so.2(指向libfuse-2.7.0),而libfuse-2.8.0在/usr/lib下,ld默认到/lib,/usr/lib下查找链接库,在/lib下先找到了就直接链接了,要想ld先找到/usr/lib下的libfuse,需要将/usr/lib加入到/etc/ld.so.conf中,然后执行ldconfig,ld先查找ld.so.conf中的目录,再查找默认路径,就会先链接到/usr/lib下的libfuse。或者将/lib下的libfuse.so的软连接指向/usr/lib下的libfuse-2.8.0.
   针对不同的系统,写好脚本,安装基本上没遇到问题,为了保证机器重启后自动加载fuse.ko,可以再/etc/modprobe.conf 或/etc/rc.local中加入modprobe fuse。
  由于我每次安装都在configure时制订了—prefix=/usr,而pkg-config默认搜索.pc的路径也是/lib/pkgconfig, /usr/lib/pkgconfig,所以不需要再配置PKG_CONFIG_PATH变量,否则如果按照默认配置,fuse会被安装到/usr/local,这是PKG_CONFIG_PATH要加上/usr/local/lib/pkgconfig,否则编译的时候会提示找不到fuse.pc。
   fuse安装成功后,dnfs的安装也就简单了,进入src,直接make就ok。

关于dnfs集群性能的测试
一直觉得dnfs的性能是个问题,会影响它的应用,当时想过几种方式,提高其性能。
如使用prefetch一次读更多的数据,使用更大的客户端缓存(多次写一次刷新),但一直没静下心去实现。
   之前做毕设的时候用iozone测dnfs的性能,读的性能最高能达到40+m,写的性能很多时候低于1m,让人心寒,后来fuse-2.8支持big_writes,写的性能提高很多。这次我们使用xdd测试,xdd包含一个timeserver模块,gettimeserver模块,和一个xdd模块,timeserver用于做时间服务器,用于同步时间,各个测试节点通过timeserver来同步,可以做到并发产生读写请求。先测试了几组数据,发现性能不是很好,后来使用投机取巧的方法,多次读一个小文件,提高系统缓存命中率来提高性能,的却it works。另外dnfs的负载均衡算法似乎存在一定的问题,经常导致有一些机器负载很大,而其他一些机器则基本没有提供服务,为了提高整体的聚合带宽,需要将数据均匀的分布,如B去有39个节点,每组3个做数据分布,然后3组间做交叉读,以使聚合带宽达到最大(大概200-300MB/S)。后来听姚老师说他在fuse中加了个200m的缓冲区,能把性能提高到360MB/S,佩服…….
如 11,12,13node存放数据72m1
   14,15,43node存放数据72m2
   17,18,19node存放数据72m3

测试的脚本如下:RC变量为同步测试的时间

#11,12,13读取72m2
ssh root@192.168.1.x  /root/xdd63/bin/xdd.linuxsmp -op read -target /mnt/dnfs/72m2 -reqsize 128 -blocksize 1024 -numreqs 100 -passes 9 -verbose -output /root/xdd.txt -timeserver 192.168.1.1 -starttime ${RC} &

#14,15,43读取72m3
ssh root@192.168.1.x /root/xdd63/bin/xdd.linuxsmp -op read -target /mnt/dnfs/72m3 -reqsize 128 -blocksize 1024 -numreqs 100 -passes 9 -verbose -output /root/xdd.txt -timeserver 192.168.1.1 -starttime ${RC} &

#17,18,19读取72m1
ssh root@192.168.1.x /root/xdd63/bin/xdd.linuxsmp -op read -target /mnt/dnfs/72m1 -reqsize 128 -blocksize 1024 -numreqs 100 -passes 9 -verbose -output /root/xdd.txt -timeserver 192.168.1.1 -starttime ${RC} &


关于grub的一些问题
在实验平台搭建一部分已经提过一点关于grub的问题,再说说其他几种系统启动时遇到的问题。
装windows,linux双系统后,直接把linux分区删除后,系统是启动不了的,因为window的引导工具不能引导linux,所以装双系统通常是使用linux的grub去引导(grub能链式引导windows),当linux分区被删除后,windows当然不能被正确引导了,可以用windows系统引导盘进恢复模式,运行fixboot fixmbrr或是进入dos执行fdisk /mbr以修复mbr。
系统引导时,提示can’t find stage1.5,error 22,开始一直以为是grub的问题,用ubuntu的livecd将grub重写后还是如此,然后我就不知道怎么去考虑问题了,又是yj出马解决问题,原来装有系统的那块盘都不在引导设备之列,所以每次引导都会失败。
grub通过之后,出现
FS cannot open root device "" or unknown-block(8,37)
Please append a correct "root=" boot option;here are the available partition:
kernel panic - not syncing: VFS : unable to mount root fs on unknown-block(8,37)
解决方法:在grub.conf中kernel那一行加上"root=/dev/sdax",当然如果设备是IDE的,就/dev/hdx了,比如这是我的:
"kernel /boot/bzImage-2.6.26-gentoo-r1 root=/dev/sdb1"

关于磁盘空间的管理
机房的机器大多配备有三块硬盘,每块300g,而一个linux系统通常只分配了10-30g的空间,dnfs是应用层的文件系统,osd将数据写到一个特定目录(/mnt/osd)来保存,如果不做任何处理,/mnt/osd只能使用装系统时分配的空间,去掉系统数据估计剩下的空间为20g左右,跑30个节点悠久600g,为了尽量利用磁盘空间,需要将所有的可用的磁盘空间都利用起来,以前就听说过linux的逻辑卷管理,不过一直处于一个概念上的认识,在wcw的blog上发现了他毕业设计实验时也遇到了这个问题,使用lvm解决的,lvm工具将磁盘或磁盘分区创建为物理卷,并整合成为卷组,然后在卷组上划分多个逻辑卷,逻辑卷的容量在卷组范围内可以动态调整,管理起来相当方便。基本的步骤如下:
1,  如果是逻辑分区,先在其上创建新的分区
fdisk /dev/sdc   …     //新建的分区为sdc6
2, 创建物理卷  
pvcreate /dev/sdc6
pvdisplay显示物理卷信息
3, 创建卷组
vgcreate  dnfs   /dev/sdc6
如果卷组已经存在,可使用vgextend将/dev/sdc6加入。
vgextend dnfs /dev/sdc6
4,创建逻辑卷
   lvcreate –n osd –L 500G dnfs //在dnfs逻辑卷中创建osd逻辑卷,大小为200G
   可使用lvextend动态改变逻辑卷的容量
   lvextend –L +200G /dev/dnfs/osd  //将osd的空间增加200G
5, 创建文件系统
   在osd逻辑卷上使用mkfs创建文件系统
   mkfs –t ext3 /dev/dnfs/osd
   或 mkfs.ext3 /dev/dnfs/osd
6, 挂载文件系统
   mount –t ext3 /dev/dnfs/osd /mnt/osd

系统开机自动挂载逻辑卷,在/etc/fstab中加入
/dev/dnfs/osd   /mnt/osd  ext3 defaults  0 0
这样DNFS系统就能使用/dev/dnfs/osd的空间作为实际文件数据的存储空间,可以灵活的加入磁盘扩展容量。

改变ext3文件系统大小
# resize2fs /dev/dnfs/osd
这样会改变osd逻辑卷上的ext3文件系统的大小到osd逻辑卷的总大小,resize2fs也可以指定大小, resize2fs支持在线改变ext3文件系统大小,不需卸载即可调整大小。

删除操作
如果不想用逻辑卷管理器了,可以从LV,VG到PV逐层删除
# lvremove /dev/dnfs/osd
把dnfs转为休眠状态:
# vgchange -an dnfs
# lvremove dnfs
# pvremove /dev/sdc6

关于沟通与交流
越来越多体会到沟通交流的重要性了,尤其是与自己一块干事的人,真的体会到wcw当时说的“沉默寡言未必是真英雄”的意思了,一个人的时间和精力都是有限的,在团队合作时,一定要充分发挥每个人的优势,才能最有效的完成任务。拿20号晚上的事来说吧,曹sir希望我们尽可能出一份B区的测试结果,而当时已经是20晚上了,cj太累了也会去休息了。当时最大的问题就是vnc登录到网关的ubuntu系统,多打开一些控制终端就会死掉,而是用ssh工具直接短路又不好全局掌控各个机器的运行情况,跟lx商量了下,准备晚上加班测一组数据出来,其实一开始我们的想法就不一样,一直没沟通好就开始做了。
我的想法是在机房的ubuntu系统上一个个登录到其它的机器上,把所有的工作都移到机房做,这样即使晚上实验没成功,第二天cj来了后就可以接着做;而lx的想法是无论使用什么方法尽快测试一组数据出来。导致我在一个个登录节点机的时候,lxh发现在命令前加上nohup可以让虚拟终端上的命令在后台运行(no hup 忽略所有的终端信号),即使虚拟终端关闭。于是lx提出写脚本,当时他们一说,我没有坚持我的想法,开始写脚本,后来发现脚本not works,又一台台的ssh,并加入nohup执行,然后退出,把所有的机器跑起来后已测试,一堆错误,当时有点崩溃,整个人都有点昏了。yj看我们搞了一晚上都没什么结果就主动来帮我们,分析了下原因,一下子提出几种解决方案:(vnc死的原因至今未查出,我觉得vnc跟ubuntu之间可能有点。。。)
1,把我的虚拟机(fedora)拷到网关上用
2,把个人机器换到网关用(实验室的机子或机房的其他redhat,之前进网关的redhat,gnome无法加载applet工具,任务栏等东东都加载不了)
3,直接在机房登录测试(我最初的想法)
除了第一种方法,其他两种方法之前都讨论过,不过无果而终。当时想为什么这么多方案,我们确搞成当时那个结果----测试没有顺利完成,一些节点已经挂掉,并且不知道是哪些。根源就是之前没跟lx,于是去跟lx聊了下…….后来在yj的帮助下,我们重新换了网关,那台实验室曾经用过的网管用的redhat系统似乎跟原来网关的系统一样,vnc登录,同样是gnome环境无法加载applet,所以问题一些回到了晚上吃晚饭我重启系统时候(这就是觉少交流的后果),后来yj在rhel上装了个xfce桌面环境(yj果然是见多识广,佩服),终于把问题解决了,当时已经是23号早上接近4点,由于自己的错误让yj没睡好觉,致以诚挚的歉意。

关于致谢
    上面写的差不多是最近工作的一个大致轮廓,细节上的问题不知道发生了多少,之所以没写成技术文档,介绍什么问题应该怎么解决,是因为我感觉这段时间收获的不只是技术,我想把当时的一些感受也记录下来。以上很多工作我都只是一个辅助,更确切的说是扮演着学习者的角色,主要的工作由师兄yj,fyf,师姐cj,lx们完成的,还有实验室研一的xdjm的努力。非常感谢他们的帮助,希望我们以后的学习工作会更加愉快。



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/87570/showart_2060517.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP