2012年(11)
分类: C/C++
2012-07-18 16:48:20
问题 | Linux移植版本上线后发现本地日志中压缩线程不工作,导致大量本地日志积压,通过gdb切入进程或系统重启时,程序正常 | ||
测试环境 | Linux localhost.domain 2.6.18-238.el5xen #1 SMP Sun Dec 19 14:42:02 EST 2010 x86_64 x86_64 x86_64 GNU/Linux | ||
Red Hat Enterprise Linux Server release 5.6 (Tikanga) | |||
测试方法 | 部署环境 | 主线程:
poll=2,执行system()后产生SIGCHLD信号 子线程1:poll=3 子线程2:poll=5 子线程3:poll=7 子线程4:poll=9 |
主线程:
poll=3 子线程1:poll=2,执行system()后产生SIGCHLD信号 子线程2:poll=5 子线程3:poll=7 子线程4:poll=9 |
线程数为2 | 现象:子线程收到多数SIGCHLD,主线程收到少数SIGCHLD 影响:子线程dpl_poll过程被中断,无法运行 |
现象:主线程收到多数SIGCHLD,子线程收到少数SIGCHLD 影响:主线程dpl_poll过程被中断,无法运行 |
|
线程数为3 | 现象:被选中的子线程收到多数SIGCHLD,而主线程收到少数SIGCHLD 影响:被选中的子线程dpl_poll过程被中断,无法运行 |
现象:被选中的子线程收到多数SIGCHLD,子线程1收到少数SIGCHLD 影响:被选中的子线程dpl_poll过程被中断,无法运行 |
|
线程数为4 | 现象:被选中的子线程收到多数SIGCHLD,主线程收到少数SIGCHLD 影响:被选中的子线程dpl_poll过程被中断,无法运行 |
现象:被选中的子线程收到多数SIGCHLD,子线程1收到少数SIGCHLD 影响:被选中的子线程dpl_poll过程被中断,无法运行 |
|
线程数为5 | 现象:被选中的子线程收到多数SIGCHLD,主线程收到少数SIGCHLD 影响:被选中的子线程dpl_poll过程被中断,无法运行 |
现象:被选中的子线程收到多数SIGCHLD,子线程1收到少数SIGCHLD 影响:被选中的子线程dpl_poll过程被中断,无法运行 |
|
结论 | system函数会产生一个子进程去执行指定命令,执行完成后产生SIGCHLD信号; | ||
多线程环境下,进程信号会随机的发送给产生信号的线程或任意指定的线程; | |||
影响 | 本地日志系统(arch进程有3个线程:压缩、上传、管理lostfile) | ||
其他进程内使用多线程的系统 | |||
修正方法 | 参见dpl_poll代码 |