• 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;
    }

  • 相关阅读:
    414. Third Maximum Number 第三大的数字
    java 正则表达式
    将含有逻辑运算符的字符串解析为逻辑符号
    ora-01830:日期格式图片在转换整个输入字符串之前结束
    mysql的字符拼接
    oracle执行计划详解
    oracle获取执行计划及优缺点 详解
    kmp算法中的nextval实例解释
    kmp算法中的next数组实例解释
    哈夫曼实例解释(哈夫曼编码)
  • 原文地址:https://www.cnblogs.com/vanishfan/p/2774797.html
Copyright © 2020-2023  润新知