Home

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

迷失在时间里

好久没写写自己心里的感受了。大概自从毕业工作之后,每天忙很多的事情,就不再有心情去体会一些事情。习惯了忙碌于工作,在这个城市的街头、地铁和公交站穿行,每天想的是五环的房价、今天有没有雾霾和路上堵不堵,只有夜深人静的时候才会想起以前的日子。 想起北航的参天大树,想起以前的同学,想起清华的荷塘,想起校园里美好的日子和可爱的女生,想起晚上安静的校园和校园外的车水马龙。大学的生活确实是人生最美好的几年,让你无论什么时候回想起来都觉得心底柔软、岁月静好。 有时候觉得自己迷失在时间里了。每天早晨醒来,想的都是匆匆逝去的时间和忙不完的事情。停下脚步,听见风穿过的声音,才觉得时间的洪流里面,也有这些许的温存,有难得的避风港,让灵魂停下来歇息一下。哎,我曾经是多么感性的一个人啊… 物是人非。尽量不...

Read more

dirname和basename的一些细节

作为获取文件名和文件路径的函数,dirname和basename的签名是: #include <libgen.h> char *dirname(char *path); char *basename(char *path); 之前没注意的地方是这个函数的输入输出都不是const的,也就意味着这个函数调用过程可能会修改char*指向的string内容。所以直接输出一个不可变字符串是不行的,同理,也要考虑这个非const函数会破坏入参。也就是: char *str = “/abc/def”; printf(“%s\n”, dirname(str)); 会core掉。而 #include <stdio.h> #include <lib...

Read more

数据库锁和隔离级别的总结

最近在琢磨MVCC和悲观乐观锁的问题,感觉有些以前学习的点没有串联起来,主要是隔离级别和锁相关的,这里总结思考一下: 两阶段锁解决了什么问题 两阶段锁主要解决事务调度的可串行化,保证了调度是正确的。一个简单的例子参考度娘这里。 实现两阶段锁对应了什么隔离级别。 两阶段锁保证了基本的隔离级别正确性,RC之上的隔离级别(包含RC)都需要至少保证两阶段锁。一个例外是如果where条件不走索引的话,是可能全表加锁的,这种情况下mysql为了性能提前解锁了不满足条件的行,参见这里。 各个隔离级别对应的加锁策略。 这个比较简单了: - RU:读加S锁,写加X锁,完成即可释放。 - RC:读加S锁,写加X锁,读锁完成可释放,写锁一直...

Read more