gearman其实不是重点,因为我就是抄了一遍perldoc的样例而已。关键在服务器上的log4j日志是回滚的,所以需要配合回滚(猜测log4j的DailyRollingFile回滚方式类似mv resin.log resin.log-ymd && reload,这样在回滚后,FH还在resin.log-ymd上,就读不到新日志了)重启FH。 另:tail命令有个参数-F/–follow=name,可以锁定文件名而不是文件描述符,不知道这个功能是怎么做到的? 一步一步来: 继续阅读……
03 Jun 2011 Posted in monitor
gearman其实不是重点,因为我就是抄了一遍perldoc的样例而已。关键在服务器上的log4j日志是回滚的,所以需要配合回滚(猜测log4j的DailyRollingFile回滚方式类似mv resin.log resin.log-ymd && reload,这样在回滚后,FH还在resin.log-ymd上,就读不到新日志了)重启FH。 另:tail命令有个参数-F/–follow=name,可以锁定文件名而不是文件描述符,不知道这个功能是怎么做到的? 一步一步来: 继续阅读……
01 Jun 2011 Posted in perl
给我自己的学习计划做个开头,从html::template开始试用。
首先利用上上篇的nmap.pl脚本,提取一些数据,然后展示在页面上。
cgi脚本如下:
perl#!/usr/bin/perl -w
use HTML::Template;
use XML::Simple;
use Net::MySQL;
#定期执行这个
#system("nmap -n -p 22,5666 10.168.168.0/23 10.168.170.0/24 -oX output.xml");
my $text = XMLin("output.xml");
#读取html模版
my $temp = HTML::Template->new(filename => '../template/html/server.tmpl');
my $localhost = '127.0.0.1';
my @array = ();
my $i = 0;
my $hash = {};
while ( $text->{host}->[$i] ) {
#因为新增了ssh端口扫描,所以xml解析和前例稍有不同
my $ssh_state = $text->{host}->[$i]->{ports}->{port}->[0]->{state}->{state};
my $nrpe_state = $text->{host}->[$i]->{ports}->{port}->[1]->{state}->{state};
my $ip = ref($text->{host}->[$i]->{address}) eq 'ARRAY' ? $text->{host}->[$i]->{address}->[0]->{addr} : $text->{host}->[$i]->{address}->{addr};
my $mac = ref($text->{host}->[$i]->{address}) eq 'ARRAY' ? $text->{host}->[$i]->{address}->[1]->{addr} : '00:1E:C9:E6:E1:7C';
$i++;
my $channel = &mysql_query($mac);
#将ip按照频道排成列表,每个ip存有ssh和nrpe状态
if ( exists $hash->{$channel} ) {
push @{$hash->{$channel}}, { 'IP' => $ip, 'SSH' => $ssh_state, 'NRPE' => $nrpe_state, };
} else {
$hash->{$channel}->[0] = { 'IP' => $ip, 'SSH' => $ssh_state, 'NRPE' => $nrpe_state, };
}
}
#将上面while生成的hash转成HTML::Template认可的array,不过array的单个元素可以是hash
foreach my $key( keys %{$hash} ) {
my $onechannel = {};
$onechannel->{"CHANNEL"} = $key;
my $j = 0;
foreach my $ip( @{$hash->{$key}} ) {
$onechannel->{"IP_LOOP"}->[$j] = $ip;
$j++;
}
push @array, $onechannel;
}
#将array传递给之前定义的html模版
#注意:不管是param还是@array里,所有的key必须都在tmpl里使用,冗余也会报错
$temp->param(CHANNEL_LOOP => \@array);
#输出成html格式
print "Content-Type: text/html\n\n", $temp->output;
#这段没什么说的,根据mac获取频道
sub mysql_query {
my $mac = shift;
my $mysql = Net::MySQL->new( hostname => $localhost,
database => 'myops',
user => 'myops',
password => 'myops',
);
$mysql->query("select channel from myhost where mac='$mac'");
&alert("New server") unless $mysql->has_selected_record;
my $a_record_iterator = $mysql->create_record_iterator();
while (my $record = $a_record_iterator->each) {
return $record->[0];
};
}
#留着后续继续处理
sub alert {
print @_,"\n";
}
然后是template文件server.tmpl:
继续阅读……
30 May 2011 Posted in nginx
第一个测试,关于http_perl_module。之前写过一篇关于nginx忽略大小写的博文,今天被朋友问上门来,url是类似/Upload/Dir/2011/123_D.jpg的形式。如果单纯的lc($r->uri),得到的url会变成/upload/dir/2011/123_d.jpg,目录是不存在的。所以要稍微改进一下。如下:
perl perl_set $url '
sub {
my $r = shift;
return $1.lc($2) if ($r->uri =~ m/^(.+\/)([^\/]+)$/);
return $r->uri;
}
';
这样就行了。
继续阅读……
27 May 2011 Posted in monitor
perl#!/usr/bin/perl -w
use XML::Simple;
use Net::MySQL;
system("nmap -n -p 5666 10.1.1.0/23 10.1.3.0/24 -oX output.xml");
my $text = XMLin("output.xml");
my $i = 0;
while ( $text->{host}->[$i] ) {
my $nrpe = $text->{host}->[$i]->{ports}->{port}->{state}->{state};
#因为在扫描到本机的时候,是没有mac的,所以到本机时不是ARRAY而是HASH
my $ip = ref($text->{host}->[$i]->{address}) eq 'ARRAY' ? $text->{host}->[$i]->{address}->[0]->{addr} : $text->{host}->[$i]->{address}->{addr};
my $mac = ref($text->{host}->[$i]->{address}) eq 'ARRAY' ? $text->{host}->[$i]->{address}->[1]->{addr} : '00:1E:C9:E6:E1:7C';
&mysql_query($ip, $mac, $nrpe);
$i++;
}
sub mysql_query {
my ($ip, $mac, $nrpe) = @_;
my $mysql = Net::MySQL->new( hostname => '10.1.1.25',
database => 'myops',
user => 'myops',
password => 'myops',
);
$mysql->query(
"insert into myhost (intranet, mac, monitorstatus) values ('$ip', '$mac', '$nrpe')"
);
}
小脚本一个,扫描内网网段内存活的机器,获取其MAC地址,以及nrpe端口情况。后期再配合myhost里的system,如果是linux(其实用nmap -O也可以获取system,但是结果不准,耗时还特别长,200台机器花10分钟),但monitorstatus还是closed的,就expect上去安装nrpe,嗯~~
继续阅读……
20 May 2011 Posted in monitor
上篇提到纯真ip库有很多行是浪费的,比如下面这种:yaml
223.214.0.0 223.215.255.255 安徽省 电信
223.216.0.0 223.219.255.255 日本
223.220.0.0 223.220.162.1 青海省 电信
223.220.162.2 223.220.162.2 青海省海东地区 平安县九歌网吧
223.220.162.3 223.221.255.255 青海省 电信
很简单的223.220.0.0-223.221.255.255段,却被拆成了三行。于是在通过起始ip结束ip计算子网之前,还需要合并一下这些ip段。
因为涉及ip比对,所以第一反应想到了mysql里有的inet_aton函数,去CPAN上搜了一下,发现有NetAddr::IP::Util模块有inet_aton函数,结果一用,发现居然生成的不是数字……于是从网上找到了pack的办法,如下:
```perl#!/usr/bin/perl -w
while(<>){
next unless $_ =~ /^(\S+)\s+(\S+)\s+(\S+)/;
my $low = unpack(‘N’,(pack(‘C4’,(split( /./,$1)))));
#下面这行是IP::QQWry模块里的写法
继续阅读……
19 May 2011 Posted in monitor
首先申明只是一个简单的方式,因为打算的是提取总列表成bind9使用的acl格式,所以不在乎性能问题。 第一步、从CZ88.NET下载QQWry数据库,然后运行IP.exe,选择“解压”,然后会在桌面生成一个qqwry.txt,这里就有四十多万行的ip记录。格式如下: 起始ip 结束ip 大区域 小区域 但是这个大区域也不是想像中的那么整齐,比如清华大学宿舍楼也是大区域的…… 好在我们DNS只需要一个大概的南北指向,根据电信占主流的现实,只要取出来联通的,其他都算电信就行了~ 第二步、把起始ip-结束ip改成acl需要的子网掩码格式,这一步用perl完成,全文如下: 继续阅读……
12 May 2011 Posted in monitor
话接上篇,继续完成这个perl脚本。花了今天一天的时间,基本定稿如下: ```perl#!/usr/bin/perl -w use Net::Ping::External qw(ping); use Tie::File; use Getopt::Long; 继续阅读……
12 May 2011 Posted in perl
考虑到公司环境必须先rsa_auth再su的问题,一般的pssh啊mussh啊sshbatch啊,都不能直接用,决定把上篇脚本里的相关部分抽出来成为一个模块,借机学习一下package和bless的简单概念: ```perl #包名,如果做pm的话,必须和(.*).pm的名字一样 package raocl; use Parallel::ForkManager; use Expect; #Exporter模块是perl提供的导入模块方法的工具 use base ‘Exporter’; #Exporter有两个数组,@EXPORT里存的是模块的sub,@EXPORT_OK里存的是模块的var; #使用模块时只能调用这些数组里有定义的东西 our @EXPORT = qw/new cluster/; #一般模块都有一个new方法来进行初始化定义 sub new { #所有sub传入的第一个参数都是本身,所以要先shift出来,然后才是脚本显式传入的参数 my $class = shift; #将参数转成哈希方式,并返回一个引用; #正规做法应该在这里指定一些必须要有的参数,比如passwd => %args{‘passwd’} || ‘123456’ my $self = {@_}; #bless上面返回的哈希引用到自己,再传递出去;以后在这之外的地方,使用被bless过的$self时自动就关联上new里的数据了。 #这里我写的极简单,看比较正式的模块写发,这里对$class还要用ref();判断是不是引用等 return bless $self,$class; } 继续阅读……
09 May 2011 Posted in perl
手头一批机器,因为历史的原因,有些密码登录、有些密钥登录,有些wheel组免密码su - root、有些又不行。为了统一管理操作,得想办法找一个能适应这四种情况的自动登录方法。 继续阅读……
13 Apr 2011 Posted in testing
某应用的碎文件生成太多,大量消耗inode,不得不做迁移调整。 原先的使用的NetApp存储,虽然可以调节inode,但是有一个上限,最高就是40000000——说实话真的挺小的啊~~ 一个同样大小的普通服务器ext3文件系统,在没有强行指定的情况下,inode都有将近3个亿,是netapp的7倍。 了解了一下ext3文件系统在分区时指定inode最大可用数的情况,大致可以理解为小于可用空间大小/256。详细分析测试情况见:http://blog.wgzhao.com/2008/04/13/how-much-inodes-do-you-need.html,大意是inode个数由block大小和单个inode的字节决定。理论上最小block是1024,实际(采用-N强行指定的话)可能是256左右。 继续阅读……
05 Apr 2011 Posted in linux
这是一本比上篇提到的老书新很多、厚很多的调优指南。虽然至今没用过suse,但同是linux内核,与redhat差距不算太大。目前只打印并看到了systemtap章节,感觉很多内容说的比上本书细致的多,继续做笔记~ 1 General Notes on System Tuning 1.2 Rule Out Common Problems 检查/var/log/warn和/var/log/messages中的异常条目; 用top或ps命令检查是否有进程吃了太多CPU和内存; 通过/proc/net/dev检查网络问题; 用smartmontools检查硬盘IO问题; 确认后台进程都是在系统负载较低的时候运行的,可以通过nice命令调整其优先级; 一台服务器运行太多使用相同资源的服务的话,考虑拆分; 升级软件。 2 System Monitoring Utilities 2.1 Multi-Purpose Tools 2.1.1 vmstat 第一行输出显示的从最近一次重启以来的平均值 各列说明: r 运行队列中的进程数。这些进程等待cpu的空闲以便执行。如果该数值长期大于cpu核数,说明cpu不足; b 等待除了cpu以外的其他资源的进程数。通常是IO不足; swpd 已用swap空间,单位KB; free 未用内存空间,单位KB; inact 可以回收的未用内存空间,只有当使用-a参数时才显示——建议使用该参数; active 使用中且没有回收的内存空间,同样只在-a时显示; buff 内存中的文件缓冲空间;相反,-a时不显示; cache 内存中的页缓存空间;-a不显示; si 每秒从内存移动到swap的数据大小,单位KB; so 每秒从swap移动到内存的数据大小,单位KB,以上两个数长期偏大的话,机器需要加内存; bi 每秒从块设备中获取的块数量——注意swap也是块设备,包含在内! bo 每秒发送到块设备的块数量,同样包括swap; in 每秒中断数,数值越大说明IO级别越高; cs 每秒文本交换数,这个代表内核从内存中某进程中提取替换掉另一个进程的可执行代码——茫然?? us 用户空间的cpu使用率; sy 系统空间的cpu使用率; id cpu时间中的空闲比——就算它是0,也不一定就是什么坏事,还得看r和b两个数值来判断; wa 如果这个数不等于0,那说明系统吞吐在等待IO。这或许是不可避免的。比如如果一个文件是第一次被读取(即没有缓存),那同时的后台写必然挂起。这个数也是硬件瓶颈的一个指标(网络或者磁盘)。最后,还有可能是虚拟内存管理上的问题; st cpu用在虚拟管理上的比例。 2.1.2 System Activity Information: sar and sadc sadc其实就是在/etc/cron.d中添加的任务。原始数据写入/var/log/sa/saDD中,报告数据写入/var/logs/sar/sarDD中。默认配置,数据每10分钟一收集;报告每6小时一收集。详见/etc/sysstat/sysstat.cron;数据收集脚本是/usr/lib64/sa/sa1;数据报告脚本是/usr/lib64/sa/sa2;有必要的话可以自己用这两个脚本收集性能数据。 sar -f指定特定的数据文件出报告 sar -P指定某一个CPU出报告 sar -r显示内存信息:kbcommit和%commit显示了当前工作负载下可能需要的最大内存(含swap); sar -B显示内核页信息:majflt/s显示了每秒钟有多少页从硬盘(含swap)读入内存,这个数太大意味着系统很慢,而且内存不足;%vmeff显示了页扫描(pascand/s)及其相关的缓冲重用率(pgsteal/s),用以衡量页面回收的效率,数值接近100说明所有so的页都重用了,接近0说明没有被扫描的页,这都很好,但不要在0-30%之间。 sar -d显示块设备信息,最好加上-p显示设备名; sar -n显示网络信息,包括DEV/EDEV/NFS/NFSD/SOCK/ALL 2.2 System Information 2.2.1 iostat -n显示nfs; -x显示增强型信息; 2.2.3 pidstat -C “top”显示命令名中包括top字符串的目标。 2.2.5 lsof 无参数:打开的所有文件 -i:网络文件 2.2.6 udevadm 本工具只有root可以使用 2.3 Processes 2.3.2 ps 显示具体某进程:ps -p $(pidof ssh) 显示格式和排序:ps ax –format pid,rss,cmd –sort rss 显示单独进程:ps axo pid,$cpu,rss,vsz,args,wchan,etime 显示进程树:ps axfo pid,args 2.3.4 top 默认每2秒钟一刷新; 显示一次即退出:-n 1 shift+p——以CPU使用率排列(默认); shift+m——以常驻内存排列; shift+n——以进程号排列; shift+t——以时间排列; 2.4 Memory 2.4.1 free free -d 1.5——每1.5秒一刷新数据 2.4.3 smaps 在/proc/${pid}/smaps中看到的是进程当前的内存页数量,即除掉共享内存以外的真正进程使用的内存大小。 2.5 Networking 2.5.1 netstat -r路由;-i网卡;-M伪装链接;-g广播成员;-s信息 2.5.2 iptraf iptraf -i eth0 -t 1 -B -L iptraf.log eth0网卡一分钟内的信息,后台收集,记入iptraf.log中。 2.6 The /proc File System /proc/devices 可用设备 /proc/modules 已加载内核模块 /proc/cmdline 内核命令行 /proc/meminfo 内存使用详细信息 /proc/config.gz 内核当前运行配置的压缩文件 详细说明见/usr/src/linux/Documentation/filesystems/proc.txt 执行的进程和库文件以及他们在内存的地址信息见/proc/***/maps文件。 继续阅读……
01 Apr 2011 Posted in linux
一本很老的书,还是RHEL3时代的,在陪GF的空隙一点点读完,把笔记整理一下发在这里,只包括自己不知道或者说容易忘记的内容,不代表调优指南。 1 Tuning the operating system 1.1 Disabling daemons 关闭不必要的后台进程。RHEL3中,默认启动的后台进程有: apmd 高级电源管理 autofs 自动挂载 cups 通用UNIX打印机系统 hpoj 惠普打印机支持 isdn 调制解调器 netfs nfslock portmap NFS支持 pcmcia PCMCIA支持 rhnsd 自动升级 sendmail 邮件转发程序 xfs 桌面程序 1.2 Shutting down the GUI runlevel: 0 halt立刻关机immediately shut down 1 single单人 2 multi-user without NFS(这个说明和一般的说法不太一样~) 3 full multi-user 5 X11 6 reboot 修改/etc/inittab如下: id:3:initdefault: #runlevel #4:2345:respawn:/sbin/mingetty tty4 #关闭多余控制台 注意:留3个,以免在被攻击的时候自己反而进不去了! 1.4 Changing kernel parameters /proc/loadavg 系统负载1/5/15分钟 /proc/stat 内核状态:进程/swap/磁盘IO /proc/cpuinfo CPU信息 /proc/meminfoo 内存信息 /proc/sys/fs/* linux可用文件数及磁盘配额 /proc/sys/kernel/* 进程号范围/系统日志级别 /proc/sys/net/* 网络细节 /proc/sys/vm/* 内存缓冲管理 1.7 Tuning the processor subsystem CPU超线程注意事项: 注意使用SMP的kernel 实际CPU数越多,超线程意义越小: 2核:提升15-25% 4核:提升1-1% 8核:提升0-5% 1.8 Tuning the memory subsystem 如果决定调整/proc/sys/vm/*的参数,最好一次只调整一个。 vm.dbflush前3个参数分别为: nfract 在buffer被转存到disk前允许的最大buffer比率 ndirty 将buffer转到disk时一次允许操作最大的buffer数 nfract_sync 转存时允许buffer中dirty数据的最大比率 vm.kswapd tries_base 一次swap传输时的pages数。如果swapping较大,适当增加该值 tries_min kswapd运行时交换的pages的最小数 swap_cluster kswapd一次写入pages的数。太小会增加IO次数,太大又要等待请求队列 1.9 Tuning the file subsystem 磁盘访问速度是ms级别的,而内存是ns,PCI是us。 磁盘IO是最关键的问题服务器举例: 文件/打印服务器:所有数据从磁盘读取 数据库服务器:大量IO,在内存和磁盘间交换数据 磁盘IO不是最关键的问题服务器举例: 邮件服务器:网络状况才是最关键的。 web服务器:网络和内存才是最关键的….. 1.9.5 The swap partition 创建多个swap区有助于提升swap性能 通常情况,多个swap采用顺序读写,即只有/etc/fstab中排名在前的swap区耗尽的情况下,才会使用下一个swap区; 可以在fstab中定义优先级,类似”/dev/sda2 swap swap sw,pri=5 0 0”的格式; 相同优先级的swap区,系统会并发使用,不同优先级之间依然要等待耗尽!——另外,如果相同优先级的swap区有一个性能较差,会连带影响整个swap性能。 1.10 Tuning the network subsystem 网络问题经常会导致其他伴生问题。比如:块大小太小会给CPU利用率带来显著影响;TCP连接数过多会带来内存使用率的急速上升…… 经常被打开的net.ipv4.tcp_tw_reuse和net.ipv4.tcp_tw_recycle的作用:缓存TCP交互中的客户端信息,包括交互时间、最大段大小,阻塞窗口。详见RFC1644。 net.ipv4.tcp_fin_timeout可以缩短TCP建连时最后发送FIN序列的时间,以便快速释放内存提供给新进连接请求。但是修改这个的时候也要谨慎,因为由此导致的死套接字数量可能引起内存溢出! net.core.wmem_max/net.core.rmem_max定义在每个TCP套接字创建时划分的内存大小,推荐设置8MB。 net.ipv4.tcp_wmem/net.ipv4.tcp_rmem的最后一个数字不能大于上面core的定义。 net.ipv4.tcp_max_syn_backlog队列存放半连接。这些连接可能是因为客户端的连接异常,也可能仅仅是因为服务器负载太高导致。除了半连接,这个配置对防范拒绝服务攻击也有效。 net.ipv4.ipfrag_low_thresh/net.ipv4.ipfrag_high_thresh规范ip碎片,一旦触底,内核会开始丢包。这对于NFS和samba等文件服务器很重要,建议设置为256和384MB。 2 Tuning tools 2.3 top STAT:S=SLEEPING,R=RUNNING,T=TRACED/STOPPED,D=INTERRUPTIBLE SLEEP,Z=ZOMBIE 2.3.1 Process priority and nice levels 优先级从19(最低)到-19(最高),默认是0。启动进程时指定nice -n 19 command,启动后改变renice 19 command 2.4 iostat tps:transfers per second,多个单独的IO请求,可以组合在一次transfer请求中。 Blk_read/s,Blk_wrtn/s:每秒的读写块个数。block大小和transfer大小一样各不相同。一般是1、2、4KB,采用如下命令查看:dumpe2fs -h /dev/sda1 | grep -F ‘Block Size’ 2.5 vmstat Process:r:等待运行的进程数,b:不可中断睡眠中的进程数 Swap:单位是KBps CPU:us:非内核时间,包括user和nice,id:在linux2.5.41前,这个数值包括了IOwait时间在内…… 2.11 ulimit -H和-S分别是hard和soft,开机启动指定的话,修改/etc/security/limits.conf即可。 2.12 mpstat 用来在多CPU的机器上查看每个CPU的情况。 继续阅读……
31 Mar 2011 Posted in php
某php应用在给图片加水印的时候,显示的中文全都成了乱码,而开发同事在它本机(ubuntu)上apt安装的lamp上显示没有问题。仔细检查过了从env到encoding到phpinfo,都没有发现问题——都符合GD函数imagettftext()的utf8要求。 还好有google,发现一个类似的文章,提出是php的编译参数中有一个–enable-gd-jis-conv,会把ttf字库中非标准拉丁文的部分,按照日文顺序映射,imagettftext()的默认编码其实被隐形指定成了日文编码euc-jp,中文自然就不正常了! 然后赶紧重新看phpinfo,真有这个参数。重新编译php,随后恢复正常显示了。 编译参数还真是不能大意啊~~ 继续阅读……
28 Mar 2011 Posted in bash
一眨眼又几天没更新,中午在Q群里聊到一个单行命令,随手记录下。
A需求:某文件如下
aaa
bbb
aaa
aaa
ccc
aaa
ddd
……
通过命令改成如下格式:
1
bbb
3
5
ccc
7
ddd
……
方法如下:
bash
echo -en 'aaa\nbbb\naaa\naaa\ndddd'|awk 'BEGIN{tag=1}{if(/aaa/){print tag;tag+=2}else{print}}'
或者更短一点:
bash
echo -en 'aaa\nbbb\naaa\naaa\ndddd'|awk 'BEGIN{tag=1}{if(/aaa/){$0=tag;tag+=2};print}'
B需求:
aaa不是文件一行的全部内容,而只是一部分。
方法如下:
bash
echo -en 'aaa\nbbb\naaa\nfdaaafdaaa\ndddd'|awk 'BEGIN{tag=1}{gsub(/aaa/,tag) && tag+=2;print}'
以上三种,凯的perl版本分别如下:
perl
perl -nale 'BEGIN{$tag = 1}if(/aaa/){print $tag;$tag+=2}else{print}'
perl -nalpe 'BEGIN{$tag = 1};$_=$tag and $tag+=2 if /aaa/'
perl -nalpe 'BEGIN{$tag = 1};$tag+=2 if s/aaa/$tag/'
继续阅读……
21 Mar 2011 Posted in monitor
之前有过一篇linux上的流量监控脚本的博文,是利用procfs进行数据运算。但BSD上的procfs和linux有所不同,它只包含了进程的信息,没有系统的统计。所以只能通过其他方法。 linux上另一种获取网卡总流量的方法是ifconfig命令,这个命令其实也是读取proc;但是BSD上的ifconfig输出里也没有…… 不过BSD上倒不是没法查流量上,事实上另外有两个命令,在实时观测中更加好用,一个是systat -if 1,几乎就是一个无色版的iptraf;另一个是netstat -idbhI bce0 1。 解释一下,systat是bsd上用来查看系统信息的一个超级利器,-if是-ifstat的简写,类似还有-vmstat等等。netstat是专门用来显示网络状态的,最常用的就是-ant显示所有的TCP链接,这里用的idbhI,表示interface、drop、bytes、human,也就是用方便读取的格式输出某网卡的流量值。 但是这两个命令,都是持续输出,必须接到^C信号才会退出运行。在实时管理时很好用,在做监控脚本的时候,就弄巧成拙了…… 好在netstat参数多,调整一下,使用idbnf参数(family)即可输出网卡总流量值,然后按照linux上一样的思路进行计算了。 最终脚本如下: 继续阅读……
18 Mar 2011 Posted in perl
想把前端缓存几十台服务器的访问日志数据计入数据库中,以便核算各频道带宽。按照一般流量统计的惯例,在服务器上设定crontab每5分钟rotate一次access.log。但是想到一个问题——当A服务器select了数据库里的数据但还没来得及update时,B服务器也开始执行任务select数据来了,最后的结果就不准确了——我相信这个问题对coder来说很低级,不过我是op,搞不来…… 继续阅读……
17 Mar 2011 Posted in linux
需要给某台服务器加内存,准备关机的时候,却一直报错。考虑直接断电危害比较大,还是找找原因,报错如下: shutdown: timeout opening/writing control channel /dev/initctl init: timeout opening/writing control channel /dev/initctl 从messages日志里没有发现任何附加信息。只能求助百度。好在解答很多: 是原有的initscripts和SysVinit找不到了导致的。 传上去initscripts-8.45.19.EL-1.x86_64.rpm和SysVinit-2.86-14.x86_64.rpm两个包,rpm -ivh安装。 重新poweroff还是报错;但强制-f跳过shutdown过程后,成功了。稍后再启动设备,试着再敲一次poweroff,这次就不报错,成功关机了。 继续阅读……
15 Mar 2011 Posted in CDN
简单的试试varnish和apache traffic server。跟squid进行一下对比。 介于varnish和ats都是出现不太久的东西(至少是开源流行不长),选择其最新开发版本测试,正巧都是2.15版。呵呵~ varnish配置文件,只修改了backend到具体某台nginx发布点上。其他都是反向代理缓存的标配。(可参考张宴博客http://blog.s135.com和varnish权威指南http://linuxguest.blog.51cto.com/195664/354889) ats说明更少,从目前的资料看,修改了records.config中的监听,cache.config遵循源站未改,remap.config添加了map一条,绑定域名到同一台nginx上。 注:varnish和ats都没有修改缓存路径,即分别为var/varnish/varnish.cache和var/trafficserver,都是磁盘。 继续阅读……
03 Mar 2011 Posted in
原文地址:http://linuxsysadminblog.com/2010/09/a-day-in-the-life-of-facebook-operations/ 顺便说一句,这个linuxsysadminblog.com确实不错。 文章是笔者在现场听Facebook系统工程师汤姆·库克在2010年的surge可扩展和性能大会上的讲演时记录下来的—— 这是到目前为止最火爆的讲座了,还没开始就只剩下点站着的空间…… Facebook运维需要支持多大的应用环境: 1、在facebook花上每个月7亿分钟(不太明白这个意思,一个月明明只有43200分钟) 2、60亿次内容更新; 3、30亿张图片; 4、实现100万连接; 5、5亿活跃用户。 基础设施建设的发展: 1、租用IDC达到瓶颈; 2、开始自建; 3、目前已为加利福尼亚和弗吉尼亚两州服务。 发展历程: 从LAMP起步,然后拆分负载均衡,web服务器,app服务器,memcached,数据库。 最早的Facebook是一个单纯的发布在apache上的php站点。但后来php不足以支持Facebook的访问了,现在,Facebook已经开始编译一些php功能成C++程序,这就是业界闻名的HipHop。 Facebook大概拥有世上最大的memcached集群,超过300TB的数据存储在memcached内存中。 使用flashcache来改善mysql性能。 已实现支持的服务: 新闻feed、搜索、缓存。 服务使用中的编程语言: C++、php(前台)、python、ruby、java、erlang(聊天室) 各种编程语言间如何交互数据?json?soap?都不是。Facebook专用一个为各编程语言开发服务的软件框架。所有的Facebook系统后面,都是统一的一个平台。 Facebook每天都在担心: 开发、监控、数据管理、代码上线。 Facebook使用centos操作系统! 系统管理: 配置管理; 系统管理——用CFengine; 按需管理。 开发: 前台部分——每天都有新代码上线。代码统一协调,所有人都在IRC的频道里交流。每个人都可以知道发生了什么,而不单单是工程师自己。 1、程序推送按需分发; 2、代码分发通过BT的方式; 3、php是经过编译的,数百MB的二进制文件通过极小的BT种子迅速下发; 4、完成全网更新只需要1分钟。 后台部分——只有开发和运维。开发工程师写代码、测试、演示。 1、这样能迅速得到性能数据; 2、揭露各环节的真实交互(这里翻译的应该不对,看不懂……); 3、没有所谓的“提交、退出”; 4、全面参与应用变成产品的过程; 5、运维被“嵌入”每个开发团队。 代码的每一处修改和推送,都必须详细记录。 Facebook的服务器性能指标在线监控 ganglia监控系统:快速、便捷、超过500万的监控指标、可以通过网格和池的方式进行规划。 自主的监控系统 nagios监控系统:用来给各团队发报警,最开始是用的email。 Scribe高性能日志系统:最开始用的是syslogd,同时在用hadoop和hive。 怎么运行的呢: 1、定义要明确的依赖关系; 2、固定的失败次数; 3、服务器是第一步,系统架构设计。 4、现在重点是搞集群。通过功能不同进行逻辑关系划分(web、db、feed等) 5、下一步是数据中心。尤其是灾备。 6、不断的沟通——信息永远在共享中。 7、IRC。 8、大量的自动化数据获取和设置。 9、内部新闻更新。 10、内部工具的’headers’; 11、变更日志。 12、团队要短小精悍。 一个有趣的数字:平均每台Facebook的服务器8分钟就升级一次。 一个有趣的事实:Facebook最忙的时候是万圣节后的那天。 继续阅读……
01 Mar 2011 Posted in perl
原帖地址:http://bbs.chinaunix.net/thread-1860259-1-1.html 刚看到帖子,试着自己做做,首先必须承认做的过程是重新去翻过资料了…… 继续阅读……
24 Feb 2011 Posted in database
公司RT系统某工单页面无法打开。通过httpwatch发现是图片附件比较大,卡住了页面加载最终导致。 询问当事人后,决定把图片删除掉。 右键菜单查看图片url,是http://rt.domain.com/Ticket/Attachment/123456/654321/12.jpg这样的格式~ 于是在服务器的DocumentRoot下查找相关路径,发现Ticket/Attachment下只有一个文件dhandler,这是一段perl程序。 相关部分如下: 继续阅读……
24 Feb 2011 Posted in bash
一个小需求,某目录下有五万多个模板文件,其中大概两万个是链接文件。当碰到如下情况:
lrwxrwxrwx 1 nobody nobody 59 Dec 27 15:06 10000053.mod -> /var/www/html/category/model/10000050.mod
就需要创建同名的另一个模板文件10000053.wap文件,指向10000050.wap。
怎么做?
我用了如下命令:
bash
ls -l /var/www/html/category/model | awk '$1~/^l/ && $9~ /mod$/ {gsub(/mod$/,"wap",$9);gsub(/mod$/,"wap",$NF);system("rm -f "$9" && ln -s "$NF" "$9)}'
不过从效果来看,使用gsub函数后速度慢了不少,这5万个文件花了几分钟。
继续阅读……
22 Feb 2011 Posted in linux
上redhat官网看资料的时候想起来上面有RHCE报名前的技能水平测试(用来预估水平,省掉一些基础课程的)。然后做了一下试试。地址如右:http://www.redhat.com/explore/pre-assessment 结果如下: 继续阅读……
19 Feb 2011 Posted in CDN
读百度UEO博客的文章《浏览器的加载与页面性能优化》,其中关于浏览器对单个域名连接数有一段描述,与一般的概述稍有差别。由此可见像百度这种级别的公司,对性能细节抓到什么程度——让我想起之前在腾讯大讲堂里看到的”页面代码大小要求是MTU倍数”。 继续阅读……