http://blog.chinaunix.net/u/5251/showart_398259.html
用core dump和错误自动重启技术提高软件可用性 |
一些比较关键的应用,我们总是希望它的可用性尽可能高,换句话就是尽量不要让服务中断,或者是中断的时间最短。为了达到这种目的,通常有以下几种解决方案:
- 多机备份:提供同一应用的多个实例,用特定的“心跳”检测机制探测服务状态,当一个实例发生问题时,及时将服务切换到另一个实例上以确保服务的持续性,当然同时运行多个实例,将服务在其间动态调动也能达到目的,并且比较经济,需要注意的是这个时候分发器可能发生单点错误,仍旧需要保证高可用性。
- 看门狗(WatchDog):用另外一个程序监控同一主机上的应用,当应用意外退出的时候,看门狗负责重启相应服务。systemV中init进程就能对action是respwan的程序提供这种功能,当然您还可以自己实现。除了软件看门狗,一些设备还提供有硬件的看门狗,他们负责在系统崩溃的时候,重启系统。
在编程实践中,为了提高程序的可用性,有时用多进程复合多线程的系统结构取代单纯的多线程结构或者是单线程结构,有人认为这是一种“倒退”,姑且不论是否是“倒退”,单从它对有效性的好处来说,似乎都有些牵强。
而看门狗所引入的附加进程多少也会让有些洁癖的人感到不爽,那么有没有更加干净的方法呢?
偶然想到:在Linux平台上,程序的非法运行,一般都会触发特定的信号(其中“段错误”信号SIGSEGV占多数),这些信号直接导致进程退出。既然如此,我们就可以在信号的处理函数中通过exec系列系统调用重新载入程序运行,这岂不是就能省掉看门狗进程。程序如下:
static void _restart(void) {
char buf[4096]; char exe[512]; char **argv; int argv_size, fd, i; ssize_t len; char *ptr, *ptr_end; struct rlimit limit;
/* find the file executable. */ len = readlink("/proc/self/exe", exe, sizeof(exe) - 1); if (len == -1 || len == sizeof(exe) - 1) _exit(EXIT_FAILURE
|
|
|
|
|