导言:现网有个版本上线一段时间后,通过SSH重新登陆时显示
Cannot allocate memory
错误,结果只能通过重启机器来恢复服务。通过分析发现是新的版本引入一个bug,某个进程会不停地创建新的线程,那么问题是Linux下一个进程可以创建多少个线程,从而会导致这个错误出现。
1 原因分析
问题重现,通过一个测试程序,验证错误是否会重现。
#include <iostream>
#include <pthread.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
using namespace std;
void* thr_func (void*)
{
for(;;) sleep(500);
return 0;
}
void max_thread_test ()
{
const int MAX = 4194304;
//const int MAX = 10;
int i = 0;
for (; i < MAX; ++i) {
int ret = 0;
pthread_attr_t attr;
pthread_attr_init(&attr);
// deta