使用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版本不对。我擦嘞。
后来突...
迷失在时间里
好久没写写自己心里的感受了。大概自从毕业工作之后,每天忙很多的事情,就不再有心情去体会一些事情。习惯了忙碌于工作,在这个城市的街头、地铁和公交站穿行,每天想的是五环的房价、今天有没有雾霾和路上堵不堵,只有夜深人静的时候才会想起以前的日子。
想起北航的参天大树,想起以前的同学,想起清华的荷塘,想起校园里美好的日子和可爱的女生,想起晚上安静的校园和校园外的车水马龙。大学的生活确实是人生最美好的几年,让你无论什么时候回想起来都觉得心底柔软、岁月静好。
有时候觉得自己迷失在时间里了。每天早晨醒来,想的都是匆匆逝去的时间和忙不完的事情。停下脚步,听见风穿过的声音,才觉得时间的洪流里面,也有这些许的温存,有难得的避风港,让灵魂停下来歇息一下。哎,我曾经是多么感性的一个人啊…
物是人非。尽量不...
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...
数据库锁和隔离级别的总结
最近在琢磨MVCC和悲观乐观锁的问题,感觉有些以前学习的点没有串联起来,主要是隔离级别和锁相关的,这里总结思考一下:
两阶段锁解决了什么问题
两阶段锁主要解决事务调度的可串行化,保证了调度是正确的。一个简单的例子参考度娘这里。
实现两阶段锁对应了什么隔离级别。
两阶段锁保证了基本的隔离级别正确性,RC之上的隔离级别(包含RC)都需要至少保证两阶段锁。一个例外是如果where条件不走索引的话,是可能全表加锁的,这种情况下mysql为了性能提前解锁了不满足条件的行,参见这里。
各个隔离级别对应的加锁策略。
这个比较简单了:
- RU:读加S锁,写加X锁,完成即可释放。
- RC:读加S锁,写加X锁,读锁完成可释放,写锁一直...
495 post articles, 62 pages.