nginx两个小测试(perl_set/image_filter)

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; } ';
这样就行了。 继续阅读……


nmap扫描结果xml解析脚本

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,嗯~~ 继续阅读……


续上:合并纯真ip段

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模块里的写法 # print $1 * 256**3 + $2 * 256**2 + $3 * 256 + $4 if $1 =~ /(\d+)\.(\d+)\.(\d+)\.(\d+)/;; my $high = unpack('N',(pack('C4',(split( /\./,$2))))); next if $low == $high; my $addr = $3; unless ( $hash->{$addr}->{high}->[0] ) { $hash->{$addr}->{low}->[0] = $low; $hash->{$addr}->{high}->[0] = $high; next; }; #如果中间就隔几个ip的,可以无视之,合并就是了…… if ( $low - $hash->{$addr}->{high}->[0] < 16 ) { $hash->{$addr}->{high}->[0] = $high; next; }; unshift @{$hash->{$addr}->{low}}, $low; unshift @{$hash->{$addr}->{high}}, $high; }; foreach $addr ( keys %{$hash} ) { my $i = 0; while ( $hash->{$addr}->{low}->[$i] ) { print $addr . "\t" . &nota($hash->{$addr}->{low}->[$i]) . "\t" . &nota($hash->{$addr}->{high}->[$i]) , "\n"; $i++; } }; sub nota { my $aton = shift; @a = unpack('C4',(pack('N',$aton))); return (join "\.",@a); };
pack真复杂,基本看不懂perldoc,唉…… 继续阅读……


从纯真数据库里获取ip列表

19 May 2011 Posted in  monitor

首先申明只是一个简单的方式,因为打算的是提取总列表成bind9使用的acl格式,所以不在乎性能问题。
第一步、从CZ88.NET下载QQWry数据库,然后运行IP.exe,选择“解压”,然后会在桌面生成一个qqwry.txt,这里就有四十多万行的ip记录。格式如下:
起始ip 结束ip 大区域 小区域
但是这个大区域也不是想像中的那么整齐,比如清华大学宿舍楼也是大区域的……
好在我们DNS只需要一个大概的南北指向,根据电信占主流的现实,只要取出来联通的,其他都算电信就行了~
第二步、把起始ip-结束ip改成acl需要的子网掩码格式,这一步用perl完成,全文如下:
perl #!/usr/bin/perl -w use Net::IPAddress::Util::Range; while(<>){ next unless $_ =~ /^(\S+)\s+(\S+)\s+(.+)/; my $range = Net::IPAddress::Util::Range->new({ lower => $1, upper => $2 }); map {printf "%s\t%s\n", $_, $3 } $range->tight()->as_cidrs(); }
其中tight()->as_cidrs()其实是Net::IPAddress::Util::Collection的函数(Range.pm里use了这个函数)。tight将不规律的ip段划分成规律的子网,cidrs将类似(1.1.1.0 .. .1.1.1.255)改成1.1.1.0/24。
如果直接采用Net::IPAddress::Util::Range的$range->as_cidr()的话,它会把一个不规律的ip段取一个最近的规律子网来显示……比方1.59.0.0-1.60.149.255会被计算成1.57.0.0/13!!
不过这个还有一个问题,就是没有多行合并,导致条目太多~~这个之后再看吧~ 继续阅读……


链路故障应急处理脚本

12 May 2011 Posted in  monitor

话接上篇,继续完成这个perl脚本。花了今天一天的时间,基本定稿如下:
```perl#!/usr/bin/perl -w
use Net::Ping::External qw(ping);
use Tie::File;
use Getopt::Long; 继续阅读……


学习pm和bless的写法

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;
} 继续阅读……


perl的Expect模块

09 May 2011 Posted in  perl

手头一批机器,因为历史的原因,有些密码登录、有些密钥登录,有些wheel组免密码su - root、有些又不行。为了统一管理操作,得想办法找一个能适应这四种情况的自动登录方法。 继续阅读……


linux系统脚本中的awk一例

06 May 2011 Posted in  bash

感谢@snowave童鞋,摘取了/usr/bin/run-parts最后一段的awk内容给我看: 继续阅读……


reiserfs和xfs的inode测试

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左右。 继续阅读……


《SUSE Linux Enterprise Desktop System Analysis and Tuning Guide》读书笔记

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文件。 继续阅读……


《Tuning Red Hat Enterprise Linux on IBM server xSeries Servers》读书笔记

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的情况。
3. Analyzing performance bottlenecks
3.1 Identifying bottlenecks
快速调优策略:
a. 了解你的系统;
b. 备份系统;
c. 监控、分析系统性能;
d. 缩小瓶颈,找出根源;
e. 解决瓶颈的时候一次只修改一个地方;
f. 返回c步骤继续,直到满意。
3.1.1 Gathering information
在收到“服务器出问题了”的报警时,提出下列问题,可以更加有效地收集信息进行故障定位:
Q:服务器的完整描述?包括:模块、使用时长、配置、外围设备、操作系统版本号……
Q:能准确描述一下问题所在么?包括:症状表现、各种错误日志记录……
Q:问题是谁碰到/发现的?一个人、某些特定的人群,还是所有的用户?由此可以大概猜测问题是网络、应用还是客户电脑。另外:性能问题可能不会立刻从服务器反应到客户端上来,因为网络延迟经常会覆盖掉其他问题。这个延迟包括网络设备,也包括其他服务器提供的网络服务,比如域名解析~
Q:问题可以再现么?所有可以再现的问题都是可以解决的!
重现故障的步骤是什么?这可以协助你在测试环境完成调优工作。
问题是持续发生的么?如果是断续发生的,赶紧找出让它重现的办法,最好就是能按你的剧本指令重现……
问题是不是周期性的固定某个时间发生?查查那时候是不是有人登陆了?尝试梗概系统,看问题会重现么?
问题真的很不常见?如果真是如此,那只能说rp有问题了,事实上,绝大多数问题都是可重现的~对没法重现的,那就出网管绝招:reboot、然后更新升级驱动和补丁。
Q:问题什么时候开始的?逐渐显现还是突然爆发?如果是逐渐,那应该是积累出来的;如果是突然,那考虑是不是外设做了改动。
Q:服务器是不是有变动,或者客户端的使用方法变了?
Q:事情紧急么?要求几分钟内搞定还是未来几天?
3.1.2 Analyzing the server’s performance
在任何排障动作前,牢记备份!!
有必要为服务器创建一份性能日志,内容包括:进程、系统、工作队列、内存、交换页、磁盘、重定向、网卡……
3.2 CPU bottlenecks
动态应用/数据库服务器,CPU常常是瓶颈,但实际经常是CPU在等待其他方面的响应。
3.2.1 Finding CPU boottlenecks
注意:同时不要运行多个工具,以免给CPU增加负载
3.2.2 SMP
进程在CPU之间进行切换时需要消耗一点的时间,所以绑定CPU比较有用。
3.2.3 Performance tuning options
关闭非必须进程;调成优先级;绑定CPU;CPU主频,是否多核;更新驱动;
3.3 Memory bottlenecks
free命令参数-l -t -o,分别表示low/high,total,old(不显示buffer信息)
3.3.2 Performance tuning options
调整页大小,默认是4/8KB;限定user资源limits.conf;……
3.4 Disk bottlenecks
常见问题:一、硬盘数太少;二、分区数太多,导致磁头寻址时间变大。
3.4.1 Finding disk bottlenecks
写缓冲;磁盘控制器负载;网络延时导致响应慢;IO等待队列
随机读写还是顺序读写?单次IO大还是小?
表3-2
磁盘转速 latency seek-time random-access-time IOPS Throughout
15000 2ms 3.8ms 6.8ms 147 1.15MBps
10000 3ms 4.9ms 8.9ms 112 900KBps
7200 4.2ms 9ms 13.2ms 75 600KBps
在一个大概70%读30%写的随机IO型正常负载的服务器上,采用RAID10比RAID5能提高50-60%的性能。
打开文件太多时,会因为寻址时间太长导致响应的变慢
iostat的指标:
%util 被IO请求消耗的CPU比例
svctm 完成一个请求的平均时间,单位ms
await 一个IO请求等待服务的平均时间,单位ms
avgqu-sz 平均队列长度
avgrq-sz 平均请求大小
rrqm/s 发送到磁盘的每秒合并读请求数
wrqm/s 发送到磁盘的每秒合并写请求数
3.4.2 Performance tuning options
顺序读写换磁头;随机读写加磁盘;用硬件RAID卡;加内存
3.5 Network bottlenecks
3.5.2 Performance tuning options
检查路由配置;子网;网卡速率;TCP内核参数;换网卡;bonding
4 Tuning Apache
4.1 Gathering a baseline
吞吐量:每秒请求数和每秒传输字节数;请求处理响应时间……
4.5 Operating system optimization
文件打开数;进程数;文件访问时间——不记录atime的作用是消减IO峰值!
4.6 Apache 2 optimizations
如果文件是通过NFS方式发布的,apache不会采用sendfile方式缓存文件,配置文件请选择“EnableSendfile Off”!
4.6.1 Multi-processing module directives
经常需要重启的,加大StartServer;
负载较大的,加大MinSpareServers到25,MaxSpareServers到125;
MaxClients最大只能是256,内存不足时应该减少;
4.6.2 Compression of data
默认的6级压缩比,可以带来72%的带宽减小。太高级别压缩,对CPU有影响。
在测试中,启用压缩的apache带宽减小70%;cpu负载上升87%到饱和状态,能同时处理的客户端请求数降到三分之一。
vary头的作用:告知代理服务器对支持压缩的客户端只发送压缩后的内容。
apache2只在客户端请求包含Accept-encoding: gzip和Accept-encoding: gzip, deflate的时候才压缩数据。
4.6.3 Logging
使用WebBench的时候,一般会有2%的请求是404的,这可能导致error_log迅速变大!
5 Tuning database servers
5.1 Important subsystems
CPU:
数据库都是多线程的,最好使用16核以上CPU,2级缓存相当重要,命中率最好在90%以上;
内存:
缓冲是数据库最重要的部分。编译内核时请确认CONFIG_HIGHMEM64G_HIGHPTE=y这项。
磁盘:
数据库会有大量的磁盘IO以完成数据在内存和硬盘的交换。一般每个xeon的CPU需要对应10块高速硬盘,最好能有50块10000转的磁盘。IBM的xSeries 370使用450块10000转磁盘以达到最大吞吐量——每分钟40000次交换。 继续阅读……


php编译参数问题一例

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,随后恢复正常显示了。
编译参数还真是不能大意啊~~ 继续阅读……


awk单行命令

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/' 继续阅读……


BSD上的流量监控脚本

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上一样的思路进行计算了。
最终脚本如下:
bash#!/bin/bash /usr/local/bin/gawk 'BEGIN{flow="netstat -idbnf inet";while((flow) | getline){now_in[$1]=$7;now_out[$1]=$10};time=systime()}{if_in[$1]=(now_in[$1]-$2)*8/(time-$4);if_out[$1]=(now_out[$1]-$3)*8/(time-$4)}END{printf "OK. The flow is %.2f,%.2f,%.2f,%.2f Kbps | bce0_in=%d;0;0;0;0 bce0_out=%d;0;0;0;0 bce1_in=%d;0;0;0;0 bce1_out=%d;0;0;0;0",if_in["bce0"]/1024,if_out["bce0"]/1024,if_in["bce1"]/1024,if_out["bce1"]/1024,if_in["bce0"],if_out["bce0"],if_in["bce1"],if_out["bce1"];for(i in now_in){print i,now_in[i],now_out[i],time > "/tmp/if_flow.txt"}}' /tmp/if_flow.txt
脚本就一行,不过就有一个缺点比不上分开写很多行的shell脚本,第一次运行前必须手动touch /tmp/if_flow.txt。因为如果这个文件不存在的话,awk会报错,执行不到END{}来,不会自动生成这个文件的……
另:systime()函数是gawk特有的,而BSD上默认的是awk,所以需要安装gawk(在/usr/ports/lang/gawk目录下make&&make install);或者在awk中采用shell变量,定义time=’date +%s‘来调用了。 继续阅读……


gearman单机试验

18 Mar 2011 Posted in  perl

想把前端缓存几十台服务器的访问日志数据计入数据库中,以便核算各频道带宽。按照一般流量统计的惯例,在服务器上设定crontab每5分钟rotate一次access.log。但是想到一个问题——当A服务器select了数据库里的数据但还没来得及update时,B服务器也开始执行任务select数据来了,最后的结果就不准确了——我相信这个问题对coder来说很低级,不过我是op,搞不来…… 继续阅读……


linux小报错一例

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,这次就不报错,成功关机了。 继续阅读……


squid/varnish/ats简单测试

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,都是磁盘。 继续阅读……


Facebook运维工程师的一天

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最忙的时候是万圣节后的那天。 继续阅读……


CU的perl大赛

01 Mar 2011 Posted in  perl

原帖地址:http://bbs.chinaunix.net/thread-1860259-1-1.html
刚看到帖子,试着自己做做,首先必须承认做的过程是重新去翻过资料了…… 继续阅读……


RT故障处理操作一例

24 Feb 2011 Posted in  database

公司RT系统某工单页面无法打开。通过httpwatch发现是图片附件比较大,卡住了页面加载最终导致。
询问当事人后,决定把图片删除掉。
右键菜单查看图片url,是http://rt.domain.com/Ticket/Attachment/123456/654321/12.jpg这样的格式~
于是在服务器的DocumentRoot下查找相关路径,发现Ticket/Attachment下只有一个文件dhandler,这是一段perl程序。
相关部分如下: 继续阅读……


awk一例

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万个文件花了几分钟。 继续阅读……


没事试试RH的技能测试

22 Feb 2011 Posted in  linux

上redhat官网看资料的时候想起来上面有RHCE报名前的技能水平测试(用来预估水平,省掉一些基础课程的)。然后做了一下试试。地址如右:http://www.redhat.com/explore/pre-assessment
结果如下: 继续阅读……


浏览器连接数的小区别

19 Feb 2011 Posted in  CDN

读百度UEO博客的文章《浏览器的加载与页面性能优化》,其中关于浏览器对单个域名连接数有一段描述,与一般的概述稍有差别。由此可见像百度这种级别的公司,对性能细节抓到什么程度——让我想起之前在腾讯大讲堂里看到的”页面代码大小要求是MTU倍数”。 继续阅读……


apache的rewrite伪静态化问题一例

16 Feb 2011 Posted in  apache

某应用系统有一个产品翻页浏览,为了利于搜索引擎,准备把/search.html?param=1-2-3-4-5做伪静态化,变成/search/1-2-3-4-5.html的url显示。 继续阅读……


linux内核编译升级

14 Feb 2011 Posted in  linux

N年没更新的ipvsadm终于在今年春节前更新了,正好手头有lvs的任务,赶紧试试。lvs上说的很清楚,ipvsadm的1.2.26版仅工作于linux kernel2.6.28以上版本。所以首先要把现有的2.6.18的linux kernel升级。 继续阅读……