用timecat来定位日志
介绍一个日志grep的神器。
做系统开发的人都有从海量日志里面定位bug的经历,大家一般用如下几种方法:
head -n xxx
tail -n 1,大概定位位置
直接grep日志来找到对应的行号并用sed cut一段出来。
把日志灌倒hive等ETL工具里面。
但是如上几种方式要么太慢,要么太复杂。最近突然想到有没有二分·grep的工具,搜到如下一个工具timcat:
安装:
pip install timecat
使用:
timecat -d ‘2016-01-02’ -s ‘20:13:14’ -e ‘20...
python是一门蛋疼的语言
最近在分析一个问题,用python写的测试脚本里面跟store节点通信的时候加了一个starttime和超时,store判断了startime跟当前时间之间是否已经达到超时时间,如果到达就拒绝掉。这个脚本在测试case数少的时候没啥问题,数量大了之后就有超时的问题。开始直接调大了timeout让测试先过去了,最近加了多重timeout判断,不能直接为了测试改参数了,分析一下怀疑timeout只生成了一次,封包代码如下:
def pack_packet(ver, pcode, channel, sess, data):
fields = (i8(ver), u16(pcode), u16(channel), u64(sess), i64(len(data)), i64(tim...
ccache和cgo并存的问题
ccache是加快编译的神器,有了ccache,忘了distcc。但是发现go和c混编的项目里面如果用了cgo的话,go编译的时候ccache会报错。主要是传给ccache的某些参数ccache不认识。错误如下:
/usr/bin/ccache: invalid option – ‘d’
Usage:
ccache [options]
ccache compiler [compiler options]
compiler [compiler options] (via symbolic link)
Options:
-c, --cleanup delete old files and recalculate size counters
...
使用nfs挂载网络磁盘
分布式环境下经常需要到各个节点启动server,常见的方式推的方式,比如scp到各个结点,但是有时候更新的文件少儿需要scp的文件比较多。这时候可以选择nfs挂载的方式把编译好的文件放到网络磁盘上,然后共享到其他的服务器,这样可以按需使用。
首先配置一下nfs服务器。假设系统都是centos:
yum install -y nfs-utils
yum install -y portmap
rpm -qa | grep nfs
事实上看centos6.5以上portmap应该被rpcbind替代了,而已安装nfs-utils的时候应该顺便安装了rpcbind。之后配置一下需要挂载的磁盘:
文件/etc/exports:
/tmp rz*(rw,async) yf*(ro)
...
跨线程解锁安全的spinlock
在C语言下面我们可能会写出如下的代码:
static pthread_spinlock_t lock;
__attribute__((constructor))
void lock_constructor () {
if ( pthread_spin_init ( &lock, 0 ) != 0 ) {
exit ( 1 );
}
}
int func(xx) {
int ret = 0;
if (xx) {
ret = ERR1;
goto exit;
}
pthread_spin_lock(&lock);
if (xx) {
ret = ERR2;
...
有关coredump没有符号的问题
线上server core掉了,看dmesg能看到core的日志,
s3store[16586]: segfault at 2a28000 ip 00007fda20543b58 sp 00007fd9e9894128 error 4 in libc-2.12.so[7fda204ba000+18a000]
但是/proc/sys/kernel/core_pattern指向的位置并没有core文件,改一下core_pattern再跑应该能core出来,不过并不是稳定复现的。所以只能先凭这条日志来分析了。从core的位置看,大概率应该是malloc里面的问题。用
addr2line -e xxx 00007fda20543b58
看到的结果是??:0。怀疑是glibc没有调...
union和struct相互嵌套时的初始化
typedef union {
volatile int64_t atomic;
struct{
int32_t pid;
int32_t atomic32;
};
} S3Atomic;
int main(int argc, const char *argv[]) {
S3Atomic atomic = ;
printf("%x\n", atomic.pid);
printf("%x\n", atomic.atomic32);
printf("%lx\n", atomic.atomic);
return 0;
}
参考如下代码
/*
* This sample shows definition and initiation of a struct...
logrotate版本问题
线上运维过程中切日志用了logrotate,但无奈日志打的太多,一天的日志几十G难以分析,遂决定改成每小时切分一次日志。从logrotate的说明看有hourly的支持,但是直接把daily改成hourly之后启动报错:
unknown option ‘hourly’
感觉是logrotate 3.8.7的版本不支持hourly语法
rpm安装logrotate高版本的包提示缺少fillup和其他的依赖,同时glibc的版本也要求高版本。于是下载了logrotate的源码安装,以最新版本3.9.2为例
./autogen.sh
./configure
提示缺少libpopt头文件,下载了libpopt 1.5的源码安装,提示libtool版本不对。我擦嘞。
后来突...
506 post articles, 64 pages.