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

  • 相关阅读:
    骑士飞行棋第二版(已完善)
    骑士飞行棋第一版(掷骰子方法分开)
    do -while语句的使用
    随机数例子(Random)
    Day6_time模块
    Day6_正则表达式
    Day6_内置函数
    centos6-7克隆主机网卡无法启动问题
    rsync+innotify做到同步式更新
    apache压力测试工具的apache bench和JMeter的安装
  • 原文地址:https://www.cnblogs.com/vanishfan/p/2774797.html
Copyright © 2020-2023  润新知