日志内容形如:E1113 11:08:27.761541 19599 ServiceKV_server.skeleton.cpp:258] MYSQL ERROR: Can't create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug
今天发现程序error.log日志报mysql出错,大概报的是mysql资源已用尽,创建不了新的线程,
查看了下程序代码逻辑如下, 初步定为mysql_real_connet问题,但这个需要使用mysql句柄所以可能与句柄mysql有关,
bool InitStorage() {
mysql_init(&mysql); /////////////////// 1
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME,"UTF8");///////////////////// 2
char * ret_conn = (char*)mysql_real_connect(&mysql, \
FLAGS_mysql_host.c_str(), \ //////////////////////////////////////////////ServiceKV_server.skeleton.cpp:258
FLAGS_mysql_user.c_str(), \
FLAGS_mysql_pass.c_str(), \
FLAGS_mysql_dbname.c_str(), \
FLAGS_mysql_port, \
FLAGS_mysql_socket.c_str(), \
0);
if(NULL == ret_conn){
LOG(ERROR) << "MYSQL ERROR: " << mysql_error(&mysql);
return false;
}
return true;
}
由于程序的逻辑中会判断执行sql失败后会在循环中反复申请例如:
while(1){
/*调用InitStoage*/
}
所以初步断定为大量重复申请导致,目前将1,2两处移到其它地方只调用一次目前看运行正常,
如果不是上述原因则需要进一步查看日志来调试更正以上内容,
另外网上看有人说ulimit -a显示的mysql 最大进程数太小,通过本地来看不是这个原因本地查看这个值很大,
另外这个MYSQL* pmysql = mysql_init(NULL)这种方式是否正常呢?
默认的mysql_close与你自调用mysql_close会不会出现double free?