Home

用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...

Read more

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...

Read more

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 ...

Read more

使用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) ...

Read more

跨线程解锁安全的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; ...

Read more

有关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没有调...

Read more

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...

Read more

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版本不对。我擦嘞。 后来突...

Read more