systemtap监控文件读写

2014年2月10日 没有评论

背景:最近在研究搭建kerberos,想搞清楚ss服务器上的.k5login具体被谁调用,是直接被sshd进程调用,还是通过krb5的相关lib调用。

systemtap可以跟踪系统调用,系统需要安装对应内核版本的debuginfo包。
我的内核版本:2.6.32-279.19.1.el6.x86_64
debuginfo包在http://debuginfo.centos.org/6/x86_64/这里下载。
wget http://debuginfo.centos.org/6/x86_64/kernel-debuginfo-common-x86_64-2.6.32-279.19.1.el6.x86_64.rpm
wget http://debuginfo.centos.org/6/x86_64/kernel-debuginfo-2.6.32-279.19.1.el6.x86_64.rpm
下载之后安装。

测试systemtap工作是否正常
stap -ve 'probe begin { log("hello world") exit() }'
以下为正常时打印内容:
Pass 1: parsed user script and 83 library script(s) using 194428virt/23084res/2976shr kb, in 120usr/10sys/135real ms.
Pass 2: analyzed script: 1 probe(s), 2 function(s), 0 embed(s), 0 global(s) using 194956virt/23804res/3204shr kb, in 0usr/0sys/4real ms.
Pass 3: translated to C into "/tmp/stapSmCG7L/stap_1777e216df712bb34ffec7ff846df815_884_src.c" using 197044virt/24208res/3564shr kb, in 0usr/0sys/0real ms.
Pass 4: compiled C into "stap_1777e216df712bb34ffec7ff846df815_884.ko" in 1260usr/230sys/1567real ms.
Pass 5: starting run.
hello world
Pass 5: run completed in 10usr/10sys/301real ms.

打印上面内容后,说明可以正常工作。

阅读全文…

分类: 技术笔记 标签:

[perl] 变量内存占用及引用计数

2014年1月10日 1 条评论

一、变量内存占用
场景:
读入一个非常大的文本文件,大概180m,处理逻辑很简单,可以忽略
伪代码如下

#!/usr/bin/perl

open(FH,"ip.txt");

#my @a=<FH>;

while (<FH>){
    chomp;
    $a .= $_;
}

1. 当直接while 读取文件句柄时,使用pmap查看程序占用内存在220m左右,可以接受
2. 当把文件句柄读入数组时,使用pmap查看程序占用内存2.1g左右,使用惊人
阅读全文…

分类: PERL/PHP技术 标签:

一些命令备忘

2014年1月10日 没有评论

perldoc:
perldoc perltoc # Perl 文档目录,了解其概要
perldoc -f # 查询 Perl 内置函数
perldoc -v # 查询 Perl 预定义变量
perldoc -q # 搜索 Perl FAQ
perldoc -m # 查看 Perl 模块
perldoc -l # 显示 Perl 模块路径
perldoc -u # 查看 Pod 源文件
perldoc -t # 无格式输出

rpm:

yum:

sed ‘/a/,/b/ s/^/#/’ file.conf 模式匹配,ab之间包括ab,行首加#

分类: 技术笔记 标签:

[perl]数组与列表

2014年1月10日 没有评论

列表是标量的集合,数组是存储列表的变量。
更精确的说,列表指的是数据,而数组指的是变量。列表的值不一定放在数组里,但每一个数组变量都一定包含一个列表(即使列表可能是空的)。

列表与数组最主要的区别在于在标量环境中:数组被解释为其长度;而列表则被解释为其最后一个元素,此时列表相当于由逗号操作符组成的表达式。
测试代码:

@array = ( "a", "b", "c" );
$num   = @array;
$list  = ( "a", "b", "c" );
print
"The number of array elements is "$num";nThe last element of list is "$list".n";

阅读全文…

分类: PERL/PHP技术 标签:

[perl]引用与解引用

2014年1月10日 没有评论

perl引用的意义:可以实现动态调用不同函数,实现Hash和Array的多个函数参数同时传递

perl的引用相当于c中的指针,有以下几种类型
一 引用
声明方式

1 一般方式
$scalarref = \$foo;          #标量引用 SCALAR,  $foo='hello';
$constref  = \186_282.42;    #标量(常量)引用 SCALAR 
$arrayref  = \@arr;          #数组引用   ARRAY,   @arr=1..100;
$hashref   = \%hash;         #hash引用   HASH,%hash=('a'=>1,'b'=>2);
$coderef   = \&add;          #函数引用  CODE,sub add{($a,$b)=@_;  return $a+$b;}
$globref   = \*STDOUT;       #GLOB句柄引用

2 匿名方式
另外声明方式采用匿名方式声明 如下(针对数组,hash,函数)
$arrRef=[1,2,3,4,5];                #指向匿名数组的引用
$hashRef={'a'=>1,'b'=>2};           #指向匿名hash的引用
$subRef=sub{return 1;};             #指向匿名函数的引用

3 符号表声明方式
$scalarref = *foo{SCALAR};          # 和 \$foo 一样
$arrayref  = *ARGV{ARRAY};          # 和 \@ARGV 一样
$hashref   = *ENV{HASH};            # 和 \%ENV 一样
$coderef   = *handler{CODE};        # 和 \&handler 一样
$globref   = *foo{GLOB};            # 和 \*foo 一样
$ioref     = *STDIN{IO};            # ?...

阅读全文…

分类: PERL/PHP技术 标签:

升级rpm包的case

2013年12月18日 没有评论

最近在升级线上使用rpm包管理的软件,踩了些小坑,在这里记录一下,以作备忘。

安装和卸载脚本的工作原理看起来很简单,但它们工作原理中的一些意外可能会引起大问题。
这里是一些基本信息,spec文件中:
%pre 在安装包之前运行
%post 在安装包之后运行
%preun 在卸载包之前运行
%postun 在卸载包之后运行

升级过程:
Run the %pre section of the RPM being installed.
Install the files that the RPM provides.
Run the %post section of the RPM.
Run the %preun of the old package.
Delete any old files not overwritten by the newer version. (This step deletes files that the new package does not require.)
Run the %postun hook of the old package.
1 运行新包的 %pre
2 安装新文件
3 运行新包的 %post
4 运行旧包的 %preun
5 删除新文件未覆盖的所有旧文件
6 运行旧包的 %postun
阅读全文…

分类: 技术笔记 标签: ,

创建rpm包的一些case

2013年11月20日 1 条评论

一、 去除 rpmbuild 自动发现的依赖关系 (automatic dependencies)
背景:在创建rpm包时,rpmbuild自动依赖了很多perl包,实际是没有的,而且在直接用tar包make,make install时也是没有报错的,所以为了不影响安装,需要去掉这些依赖。
方法一
spec文件中添加
AutoReqProv: no
这个参数有一定风险,Note that turning off all dependency information for an RPM you buildcan cause problems and frustrate your customers too.
方法二
更改 %__perl_requires 宏定义
最直接的是在spec中添加
%define __perl_requires /bin/true
或者温柔点 精准去掉某个perl包依赖,在spec文件中添加
cat < < EOF > %{name}-req
#!/bin/sh
%{__perl_requires} $* |\
sed -e ‘/perl(yourperlfile.pl)/d’
EOF
%define __perl_requires %{_builddir}/%{name}-req
chmod 755 %{__perl_requires}
方法三 通过更改此脚本find-requires
备注:
rpmbuild宏定义在/usr/lib/rpm/macros这个文件中
阅读全文…

分类: 技术笔记 标签:

Nginx 应用测试2小例

2013年10月15日 1 条评论

1 upstream max_fails fails_timeout 测试
测试机
前端转发:10.23.16.119
后端A:10.23.16.120
后端B:10.8.19.156
nginx upstream

A,B 两台后端,如果B宕机了,nginx会把请求到B的的request转发到A处,日志中的$upstream_addr参数可以记录该过程如

10.2.128.241 – - [15/May/2012:15:15:27 +0800] [0.063] [0.062, 0.001] “GET / HTTP/1.1″ 200 55 “-” “Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0″ “10.8.19.156:80, 10.23.16.120:80″
阅读全文…

分类: Nginx使用及开发 标签:

Nginx rewrite对post数据的影响

2013年9月26日 1 条评论

一、rewrite 对post影响
昨天有个同事跟我咨询他的post请求,rewrite 之后,post的数据没有传过去。遂跟他要了下配置,示意如下:

{
servername bar.com
 location /abc {
 rewrite ^ http://foo.com/abc;
}
}

看到配置就不难理解了,原因是如果rewrite 后面的参数是以http开头,那么实际就是会redirect,给客户端返回临时重定向302,这时客户端会收到302后对foo.com发起get请求(通过firebug跟踪可见)。所以之前的post请求的数据就不复存在了。上面这种情况应该使用反向代理proxy_pass。
阅读全文…

[HTTPS]-进阶-SSL session resumption

2013年9月26日 没有评论

一 说明
二 抓包验证
三 nginx配置
四 多台前端入口思考

一 说明
从上篇文章中可以了解到,整个SSL 握手的CPU(计算premasterkey和相关keyblock)和网络开销(下发证书)都非常巨大,为了减少这种性能消耗,SSL 提供了一种session resumption机制。如果客户端与服务器已经通信一次,它就可以跳整个握手段而直接行据输。握手中最耗的部分就是确立 Pre_master Secret。而经resumption的握手允新的连接使用上一次握手中确立的Pre_master_secret。就避免了公用密钥加密所需的的计算。
客户端与服务器第一次行交互,它建一个新的连接和一个新的session。如果服务器准备session resumption,就会在ServerHello 消息中给客户端一个SessionID,并把会话过程中的Master secret(保存这个后就不用在计算Pre_master_secret了,起到了减小cpu开销的作用)保存起供以后引用。客户端再次初始化一条与服务器的连接,它就会在其ClientHello 消息中使用之前的SessionID。而服务器查找cache,匹配到后通过在其ServerHello 中使用相同的SessionID同意session resumption。服务器和客户端就会跳余下的握手部分,而使用保存的Master secret生所有的加密密。
阅读全文…