linux多线程域名解析函数导致的内存空间占用增长

问题:

ljyx_sgserver_new进程是个比较小型的多线程进程,业务处理很简单,可是缺占了1.4G的内存,属于不正常现象,所以想去优化

首先对立面19个线程的数量进行修改,发现修改后占用内存也相应改变,再对线程内东西进行一步步注释掉进行调试,发现是初始化socket方法里面出现的问题

再进一步锁定,最后发现是gethostbyname域名解析函数所导致的,换了另外个域名解析函数gethostbyname_r 还是不行

处理方法:考虑到这个函数只被该进程调用,且IP都是直接数字IP 不涉及到域名,所以不使用域名解析函数,直接将IP转换为unsigned int型

问题解决,最后只占用了202MB,还在可以接受范围里,考虑到该问题可能只在多线程情况下出现所以没对其他进程进行优化,而且其他进程PHP相关代码也涉及到域名解析不适合删除该一步操作

附上相关代码:

int my_init_sock(char *host,int port_id)
{
int socket_fd;
struct sockaddr_in serv_addr;
/*
struct hostent *h = gethostbyname(host);

if(!h)
{
printf("Host name lookup failure for %s\n",host);
return -1;
}
*/
memset((char *) &serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
inet_pton(AF_INET, host, (void *)&(serv_addr.sin_addr.s_addr));
// memcpy(&(serv_addr.sin_addr.s_addr), h->h_addr, h->h_length);
serv_addr.sin_port = htons(port_id);

if ( (socket_fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("Messager TcpClient: can't open stream socket. ");
printf("Dest Server Info IP: %s Port: %d\n", host ,port_id);
return -1;
}

if (connect(socket_fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
{
printf("Messager TcpClient: can't connect to server : %s ",strerror(errno));
printf("Dest Server Info IP: %s Port: %d\n", host ,port_id);
return -1;
}

printf("Connected Server IP: %s Port: %d\n", host ,port_id);
return socket_fd;
}

posted @ 2012-11-17 13:13  vanishfan  阅读(644)  评论(0编辑  收藏  举报