优化CPU占用率及内存占用

程序写好,也调试通过了,但是今天发现有几个地方有问题,

1.cpu占用率高,最后发现是因为O_NDELAY这个参数,导致程序非阻塞,把这个参数去掉之后,CPU占用率马上下降到%1之下。

fd_gps = open( dev, O_RDWR |O_NOCTTY | O_NDELAY)

2内存占用

一个小程序,开了5个线程,内存占用44M左右,

优化CPU占用率及内存占用

怎么会这样子,我输入pmap 命令查看进程的内存占用情况,发现有5 个anon内存存占用8MB, 这5个8M就是40MB了,关键就是窧个地方。

优化CPU占用率及内存占用

但是anon又是什么呢,继续baidu,学习到pmap的输出,就2类,一类是file-backed,一类是anonymous,file-backed对应的是这段内存在硬盘上有对应的文件,而anonymous即是在硬盘上没有对应的文件,这只是大概的分类,明白就行。

但程序是哪个地方会一下子分配了8MB内存呢,我查遍程序也没有发现。

我的线程是5个,刚好有5个8MB,这么巧,肯定不是,肯定有联系,难道是线程堆栈?

继续baidu,果然是堆栈,ulimt -s,返回就是默认的8MB, 但是怎么修改呢,继续baidu,顺利找到解决方案。

原理是这样:创建线程前,首先修改线程参数,通过pthread_attr_init()初始化参数,——》修改参数——》创建线程——》支除属性,这几个步骤来完成。

 

  ret = pthread_attr_init( &attr );            //!> 初始化属性
    if(ret != 0)
    {
        perror("pthread_attr_init");
        return -1;
    }        

stack_size = 0;
    ret = pthread_attr_getstacksize(&attr, &stack_size);//获取线程堆栈大小
    //打印堆栈值
    printf("stack_size = %dB, %dk\n", stack_size, stack_size/1024);
        
    ret = pthread_attr_setstacksize(&attr, 1024*1024);//设置线程堆栈大小
    if(ret != 0)
    {
        perror("pthread_attr_getstacksize");
        return -1;
    }
    /*        启动远程升级线程                */
    ret=pthread_create(&update_id, &attr, (void *) update_tsk, NULL);
    if(ret != 0)
        printf("create update task error%d\r\n", ret);

    pthread_attr_destroy( &attr );    //!> 去除属性