登录 |

Too many open files in system

2010年01月12日 下午 35:05 | 作者:

BSD:
http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/configtuning-kernel-limits.html
LINUX:
http://www.cs.wisc.edu/condor/condorg/linux_scalability.html

php fork

2010年01月11日 下午 49:01 | 作者:

编写的php_fork脚本,都是使用文件存储,这次改为MySQL,执行之后就发现MySQL连接错误,因为使用exit()退出子进程,导致系统回收资源,关闭了数据库连接。

正确方法是使用:kill -9 避免垃圾回收。(http://php.net/manual/en/function.pcntl-fork.php)

$pid = pcntl_fork();
if ( $pid == 0 ) {
// This is the child process. Do something here.
// Instead of calling exit(), we use posix_kill()
posix_kill(getmypid(),9);
}

此外,使用成熟的类库是很好的编程习惯,能最大限度的避免问题(别人都测试过了)。比如PHP_FORK:(http://www.phpclasses.org/browse/package/1136.html)

// 以下这些是Linux 0.11 内核中定义的信号。
#define SIGHUP 1 // Hang Up — 挂断控制终端或进程。
#define SIGINT 2 // Interrupt — 来自键盘的中断。
#define SIGQUIT 3 // Quit — 来自键盘的退出。
#define SIGILL 4 // Illeagle — 非法指令。
#define SIGTRAP 5 // Trap — 跟踪断点。
#define SIGABRT 6 // Abort — 异常结束。
#define SIGIOT 6 // IO Trap — 同上。
#define SIGUNUSED 7 // Unused — 没有使用。
#define SIGFPE 8 // FPE — 协处理器出错。
#define SIGKILL 9 // Kill — 强迫进程终止。
#define SIGUSR1 10 // User1 — 用户信号1,进程可使用。
#define SIGSEGV 11 // Segment Violation — 无效内存引用。
#define SIGUSR2 12 // User2 — 用户信号2,进程可使用。
#define SIGPIPE 13 // Pipe — 管道写出错,无读者。
#define SIGALRM 14 // Alarm — 实时定时器报警。
#define SIGTERM 15 // Terminate — 进程终止。
#define SIGSTKFLT 16 // Stack Fault — 栈出错(协处理器)。
#define SIGCHLD 17 // Child — 子进程停止或被终止。
#define SIGCONT 18 // Continue — 恢复进程继续执行。
#define SIGSTOP 19 // Stop — 停止进程的执行。
#define SIGTSTP 20 // TTY Stop — tty 发出停止进程,可忽略。
#define SIGTTIN 21 // TTY In — 后台进程请求输入。
#define SIGTTOU 22 // TTY Out — 后台进程请求输出。