背景
同事用go写了一个简单转发业务流量的工具。跑了9个小时coredump。直接被冲击了三观(go也会coredump?),最后分析了看,是测试机器设置不当导致的,测试人员把日志文件重定向到终端,日志文件大小超过终端限制(这值可人为设置,默认没有大小限制),最后操作系统向服务端发送了SIGXFSZ信号,下面聊下罪魁祸首SIGXFSZ信号。
什么情况下系统会发送SIGXFSZ信号
在linux/unix系统里定义了一些异步的机制。这个就是信号。
其中有个信号名为SIGXFSZ。当某个进程写文件,单个文件大小超出限制,这时操作系统会向它发送SIGXFSZ。
SIGXFSZ信号的默认动作是:终止进程+生成coredump文件。
如何设置单个文件最大限制
1.在shell层次限制
ulimit -f value #其中 value * blocks(默认1024字节) = 最大限制的字节数
2.在c语言层次限制
struct rlimit new_rlim;
int rv;
new_rlim.rlim_cur = new_rlim.rlim_max = 10; //跟shell不同,c里面的大小代表其实字节数
rv = setrlimit(RLIMIT_FSIZE, &new_rlim);
if (rv != 0) {
printf("%d:(%s)\n", rv, strerror(errno));
return -1;
}
如何消除单个文件最大限制
1.在shell层次去掉限制
ulimit -f unlimited
2.在c语言层次去掉限制
struct rlimit new_rlim;
int rv;
new_rlim.rlim_cur = new_rlim.rlim_max = -1; //跟shell不同,c里面的大小代表其实字节数
rv = setrlimit(RLIMIT_FSIZE, &new_rlim);
if (rv != 0) {
printf("%d:(%s)\n", rv, strerror(errno));
return -1;
}