精华内容
下载资源
问答
  • Linux线程内存占用分析

    千次阅读 2014-08-11 22:39:11
    大概现象为,一个很简单的程序逻辑,开启了几个线程,程序本身并没有过多的申请内存,或者说根本没有申请内存,但是在实际运行起来后,通过PS命令和status 查看内存占用居然达到了40M,详细分析了smaps文件没有得到...

    在一次偶然的应程序开发过程中,发现一个很奇怪的问题。大概现象为,一个很简单的程序逻辑,开启了几个线程,程序本身并没有过多的申请内存,或者说根本没有申请内存,但是在实际运行起来后,通过PS命令和status 查看内存占用居然达到了40M,详细分析了smaps文件没有得到实际的分析结果。突然想到有可能是线程导致了进程的内存增加,于是便开始了测试代码的编写,测试代码如下:

    /* test_thread.c */
    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <sys/types.h>
    //#include <limit.h>
    /* 测试第一个线程 */
    void * test_thread(void * pParam)
    {
        while(1)
        {
            sleep(1);
        }
        return (void*)0;
    }
    int main(int argc , char ** argv)
    {
        /* 启动一个线程 */
        pthread_t thread_id = 0;
        pthread_create(&thread_id,0,test_thread,0);
        while(1)
        {
            sleep(1);
        }
        return 0;
    }
    [oracle@localhost test_thread]$ gcc test_thread.c -lpthread
    [oracle@localhost test_thread]$ ls
    a.out  test_thread.c
    [oracle@localhost test_thread]$ ./a.out

    一个简单的多线程测试程序,该进程开启了两个线程,一个主线程,一个子线程。通过:

    [oracle@localhost test_thread]$ ps -aux | grep a.out
    Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
    oracle   22725  0.0  0.0  12320   428 pts/0    Sl+  21:47   0:00 ./a.out
    oracle   22744  0.0  0.0   5952   748 pts/1    S+   21:47   0:00 grep a.out
    

    得到一个简单的多线程程序居然占了10MB内存之多,于是想到了多线程的线程栈空间问题,虽然多线程在运行时是共享内存空间的,但是各个线程之间的栈区还是是相对独立的,是不是在启动线程时,操作系统默认给子线程分配了过多的内存?二话不说,开始测试:

    void get_thread_stacksize()
    {
        pthread_attr_t pattr;
        int status = 0;
        size_t size = 0;
        //printf("default size:%d\n", size);
        status = pthread_attr_getstacksize(&pattr, &size);
        if(0 != status)
        {
            printf("pthread_attr_getstacksize err [%d]\n",status);
            return -1;
        }
        printf("current thread stack size:%d\n", size);
        return 0;
    }
    

    输出:

    [oracle@localhost test_thread]$ ./a.out 
    current thread stack size:10485760
    

    通过换算,刚好10MB,可见Linux默认情况下启动一个子线程需要分配10MB的线程栈空间,为了降低进程内存占用,就必须将该默认值修改,在Windows下该默认值一般为1MB,通过修改编译选项可以修改,在Linux中可以通过pthread_attr_getstacksize函数修改pthread_attr_t结构后,将pthread_attr_t结构传入pthread_create函数以修改线程默认栈大小。相关代码如下:

    #include <stdio.h>
    #include <unistd.h>
    #include <string.h>
    #include <stdlib.h>
    #include <pthread.h>
    #include <sys/types.h>
    //#include <limit.h>
    /* 测试第一个线程 */
    void * test_thread(void * pParam)
    {
        while(1)
        {
            sleep(1);
        }
        return (void*)0;
    }
    void get_thread_stacksize_for_attr(pthread_attr_t * p_pattr)
    {
        int status = 0;
        size_t size = 0;
        //printf("default size:%d\n", size);
        status = pthread_attr_getstacksize(p_pattr, &size);
        if(0 != status)
        {
            printf("pthread_attr_getstacksize err [%d]\n",status);
            return -1;
        }
        printf("current thread stack size:%d\n", size);
        return 0;
    }
    void get_thread_stacksize()
    {
        pthread_attr_t pattr;
        int status = 0;
        size_t size = 0;
        //printf("default size:%d\n", size);
        status = pthread_attr_getstacksize(&pattr, &size);
        if(0 != status)
        {
            printf("pthread_attr_getstacksize err [%d]\n",status);
            return -1;
        }
        printf("current thread stack size:%d\n", size);
        return 0;
    }
    void set_thread_stacksize(pthread_attr_t * p_pthread_attr_t,size_t size)
    {
        //pthread_attr_t pattr;
        int status = 0;
        //printf("default size:%d\n", size);
        status = pthread_attr_setstacksize(p_pthread_attr_t, size);
        if(0 != status)
        {
            printf("pthread_attr_getstacksize err [%d]\n",status);
            return -1;
        }
        printf("set thread stack size:%d\n", size);
        return 0;
    }
    int main(int argc , char ** argv)
    {
        /* 启动一个线程 */
        pthread_t thread_id = 0;
        pthread_attr_t pattr;
        pthread_attr_init(&pattr);
        /* 设置线程栈大小为1M */
        set_thread_stacksize(&pattr,1024*1024);
        //get_thread_stacksize();
        get_thread_stacksize_for_attr(&pattr);
        pthread_create(&thread_id,&pattr,test_thread,0);
        get_thread_stacksize();
        while(1)
        {
            sleep(1);
        }
        return 0;
    }
    [oracle@localhost test_thread]$ gcc *.c -lpthread
    test_thread.c: 在函数‘get_thread_stacksize_for_attr’中:
    test_thread.c:26: 警告:在无返回值的函数中,‘return’带返回值
    test_thread.c:29: 警告:在无返回值的函数中,‘return’带返回值
    test_thread.c: 在函数‘get_thread_stacksize’中:
    test_thread.c:41: 警告:在无返回值的函数中,‘return’带返回值
    test_thread.c:44: 警告:在无返回值的函数中,‘return’带返回值
    test_thread.c: 在函数‘set_thread_stacksize’中:
    test_thread.c:55: 警告:在无返回值的函数中,‘return’带返回值
    test_thread.c:58: 警告:在无返回值的函数中,‘return’带返回值
    [oracle@localhost test_thread]$ 
    [oracle@localhost test_thread]$ 
    [oracle@localhost test_thread]$ 
    [oracle@localhost test_thread]$ 
    [oracle@localhost test_thread]$ ./a.out 
    set thread stack size:1048576
    current thread stack size:1048576
    current thread stack size:10485760
    
    
    oracle    3631  0.0  0.0   5952   748 pts/1    S+   22:26   0:00 grep ./a.out
    [oracle@localhost test_thread]$ ps -aux | grep ./a.out
    Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
    oracle    3664  0.0  0.0   3108   508 pts/0    Sl+  22:27   0:00 ./a.out
    oracle    3669  0.0  0.0   5952   776 pts/1    S+   22:27   0:00 grep ./a.out
    

    通过测试,修改线程堆栈大小后有效的更改了启动线程时对内存空间的要求。

    扩展:

    1、  获取Linux默认线程栈大小

    Ulimite –s

    2、  修改Linux默认线程栈大小

    Ulimite –s value


    展开全文
  • Linux查看进程内存占用

    千次阅读 2018-12-08 18:57:36
    H 显示线程;b高亮; y 行高亮; x 列高亮 shift+&lt;&gt;移动;c 显示命令   ps用法: 可以使用一下命令查使用内存最多的10个进程 ps -aux | sort -k4nr | head -n 10 可以使用一...

    top用法:  Shift+P CPU排序;Shift+M 内存排序;f 选择列;F 选择排序列;1 显示多核 f,j:P 最后使用的CPU;H 显示线程;b高亮; y 行高亮; x 列高亮 shift+<>移动;c 显示命令

     

    ps用法:

    可以使用一下命令查使用内存最多的10个进程     

    ps -aux | sort -k4nr | head -n 10

    可以使用一下命令查使用CPU最多的10个进程     
    ps -aux | sort -k3nr | head -n 10

    $ ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'  其中rsz是是实际内存
    $ ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid' | grep oracle |  sort -nrk5
    其中rsz为实际内存,上例实现按内存排序,由大到小

    ps -eLf|grep java      查看线程

     

    pmap -d 14596

     

    参考: https://www.cnblogs.com/gaojun/p/3406096.html

     

     

    Linux commands:
    CPU: vmstat 5
    IO: sar -dp 5
    Memory: free -g
    Network: watch -d -n 5 "netstat -anp|grep 11000|wc -l"
    mpstat -P ALL

     

    展开全文
  • Linux查看内存占用

    2020-02-28 14:07:57
    统计内存最高的进程: ps aux | grep -v PID | sort -rn -k 4 | head 统计CPU使用率最高的进程: ps aux | grep -v PID | sort -rn -k 3 | head 僵尸进程: ps aux | grep defunct | grep -v grep 查找进程启动的...

     统计内存最高的进程:

    ps aux | grep -v PID | sort -rn -k 4 | head

    统计CPU使用率最高的进程:

     ps aux | grep -v PID | sort -rn -k 3 | head

    僵尸进程:

    ps aux | grep defunct | grep -v grep

    查找进程启动的线程:

    ps -eLf PID

    查看网络服务状态:

    netstat -ntlp --显示正在listening的tcp的数字格式的连接

    netstat -nulp --显示正在listening的udp的数字格式的连接

    硬件故障分析:

    1.检查磁盘使用量:服务器硬盘是否已满。

    2.是否开启了swap交换模式(si/so)。

    3.CPU使用情况:占用高CPU时间片的是系统进程还是用户进程。

    查看CPU和内存信息:

    free -m

    Mem为物理内存的容量。

    Swap为虚拟内存的容量。

    total为总容量。

    used为已用容量。

    free为空闲容量。

    shared为共享容量。

    buff/cache为缓冲及缓存的容量。

    avaiable为真正可用容量。

    一般swap used的值最好不要超过20%。

    top --CPU和内存使用实际统计

     mpstat 2 10 --查看每个CPU的使用统计。

    总线设备信息统计:

    lspci --显示系统中所有PCI总线设备或连接到该总线的所有设备

    使用dmidcode命令查看bios、system、memory、processor等硬件设备的信息

    例:dmidecode -t Memory | grep "Maximum Capacity"

    查看网卡信息:

    ethtool 网卡名

    ethtool -i ens33

    I/O性能统计

    iostat -kx 2

    vmstat 2 10

    swpd:切换到交换内存上的内存容量(默认以KB为单位),正常情况下swpd的值为0。如果swpd的值比较大,如果查过100M,但是si和so的值长期为0,则这种情况不会影响性能。

    free:空闲的物理内存容量。如果free的值很小,但是si和so的值也很小,则系统性能不会受到影响。

    buff:做为buffer cache(缓冲区缓存)的内存,对块设备的读写进行缓冲。

    cache:做为page cache(页面缓存)的内存,文件系统的缓存,如果缓存值大,则说明缓存的文件数多,如果频繁访问到的文件都能被缓存,name磁盘的读io bi(发送到块设备的块数)会非常小。

    si:交换内存使用,由磁盘调入内存。

    so:交换内存使用,有内存调入磁盘。

    提示:内存够用时,si和so的值都是0,;如果这两个值长期大于0,那么系统性能就会收到影响,磁盘、I/O和CPU资源都会被消耗完。

    bi:从块设备读入的数据量(读磁盘),单位为KB/s。

    bo:写入到块设备的数据总量(写磁盘),单位为KB/s。

    提示:随机磁盘读写的时候,这2个值越大(如超出1M),能看到CPU在I/O等待的值也会越大。

    in:每秒产生的终端次数。

    cs:每秒产生的上下文切换次数。

    提示:in和cs的值越大,有内核消耗的CPU时间会越多。

    us:用户进程消耗的CPU时间百分比。如果us的值比较高,则说明用户进程消耗的CPU时间多。但是如果长期超过50%,那么就考虑优化程序算法或者进行加速。

    sy:内核进程所消耗的CPU时间百分比。如果sy的值比较高,说明系统内核消耗的CPU资源多,这并不是良性的表现,应该检查原因。

    id:CPU处于空闲状态时间的百分比。

    wa:I/O等待消耗的CPU时间百分比。如果wa的值比较高,则说明I/O等待比较严重,这可能是磁盘大量做随机访问造成的,也有可能是磁盘的带宽出现瓶颈,如快操作等。

     

    查看当前占用I/O资源最高的进程信息,如下图所示:

    dstat --top-bio --top-io

    磁盘使用率统计:

    df -h --查看磁盘容量使用情况(检查删除文件后磁盘空间有未释放)

    fdisk -l --查看磁盘分区信息

    磁盘I/O相关参考:https://www.cnblogs.com/hanson1/p/7102206.html

    lsof命令可以列出当前系统打开的文件及目录,其中提供了大量关于这个应用程序本身和操作系统交互的信息。+D参数可以列出对应目录下的所有子目录和文件。

    操作系统日志:

    查看整体系统日志:/var/log/messages

    查看授权和认证信息:/var/log/secure

    以上两个日志中需关注:

    1)错误和告警信息,是否因为连接数过多所导致的;

    2)是否有硬件错误或文件系统错误。

    中断异常信息:

    /proc/interrupts中中断请求是否均衡分配给了CPU处理,CPU是否会由于大量网络中断请求或RAID请求而过载。

    内核信息查询:

    dmesg | more

    展开全文
  • linux 内存占用查看

    2020-12-06 20:00:34
    linux 内存查看 1.查看所有大致内存占用 ...5.查看线程堆栈信息 打印该线程id的十六进制表示 printf "%x\n" [pid] 打印该线程堆栈信息 jstack [进程id] |grep -A 10 [线程id十六进制表示] `` 查看死锁的ja

    linux 内存查看

    1.查看所有大致内存占用

    cat /proc/meminfo
    

    在这里插入图片描述

    2.查看各进程内存占用详细信息

    top
    

    在这里插入图片描述

    3.查看该进程详细信息

    cat /proc/[pid 进程id]/status
    

    在这里插入图片描述

    4.查看该进程下所有线程信息

    top -H -p [pid]
    

    在这里插入图片描述

    5.查看线程堆栈信息

    1. 打印该线程id的十六进制表示

      printf "%x\n" [pid]
      
    2. 打印该线程堆栈信息

      jstack [进程id] |grep -A 10 [线程id十六进制表示]
      

      在这里插入图片描述

    ``

    1. 查看死锁的java文件和报错定位行数
    展开全文
  • linux 查看线程

    2017-04-01 15:49:04
    3.ps aux (查看所有进程,包括线程) USER 进程的属主; PID 进程的ID; PPID 父进程; %CPU 进程占用的CPU百分比; %MEM 占用内存的百分比; NI 进程的NICE值,数值大,表示较少占用CPU时间; VSZ 进程...
  • 查看线程占用情况 3.查找java的堆栈信息 将线程id转换成十六进制 #printf %x 15664 #3d30 然后再使用jstack查询线程的堆栈信息 语法:jstack <pid> | grep -a 线程id(十六进制) jstack <pid> | ...
  • 推荐观看:BATJ面试官最喜欢问的:多线程线程并发面试题详解(volatile+ThreadLocal+Sleep)_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com通过 ps 可以获知一个进程所占用内存$ 如果要监控内存,肯定...
  • 有时候要进行压力测试,那么如何来看呢,一般我们会通过top命令查看各个进程的cpu和内存占用情况,获得到了我们的进程id,然后我们也许会通过pstack命令查看里边的各个线程id以及对应的线程现在正在做什么事情,分析...
  • 事情开始于一段内存问题,通过gperf工具抓取进程运行过程中的内存占用情况。 分析结果时发现一个有趣的事情,top看到的实际物理内存只有几兆,但是pprof统计的内存信息缺达到了几个G。 很明显是创建线程时产生的...
  • 有时候要进行压力测试,那么如何来看呢,一般我们会通过top命令查看各个进程的cpu和内存占用情况,获得到了我们的进程id,然后我们也许会通过pstack命令查看里边的各个线程id以及对应的线程现在正在做什么事情,分析...
  • Linux 进程线程查看

    2019-01-02 17:13:03
    《线上linux系统故障排查之一:CPU使用率过高》《线上linux系统故障排查之二:内存占用过高》 一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环。 下面我们将一步步定位问题,详尽的...
  • linux Java项目CPU内存占用高故障排查 top -Hp 进程号 显示进程中每个线程信息,配合jstack定位java线程运行情况 # 线程详情 jstack 线程PID # 查看堆内存中的对象的情况,如果有大量对象在持续被引用,没有被释放掉...
  • 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程查看物理CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l 查看每个物理CPU中core的个数(即核数) cat /proc/cpuinfo| grep "cpu...
  •  这个 可以用于 程序优化, 查看 哪个线程占用的 cpu 比重比较高 首先 可以通过 top -H -d 1 -p PID 查看具体 进程的 cpu ,内存 等等 占据大小 比例 -d 1 表示 刷新间隔、 -p PID表示 指定具体的进程号 再 按...
  • 所以我们在写好程序后,就需要进行测试,防止出现CPU使用率过高以及内存占用过大,导致程序不能运行的问题,下面就介绍一种简单通用的办法来实现这些功能。 第一步 在Linux环境下的线程其实就是轻量级的进程,但是...
  • Linux下编程多用多进程编程少用多线程编程IBM有个家伙做了个测试,发现切换线程context的时候,windows比linux快一倍多。进出最快的锁(windows2k的 critical section和linux的pthread_mutex),windows比linux的要...
  • 1、用命令top查看java进程的内存和cpu占用情况。2、jmap -histo pid查询指定java进程的所有对象使用内存情况。3、ps -mp pid -o THREAD,tid,time 查询所有线程列表4、将需要的线程ID转换为16进制格式:printf "...
  • 远程登录后,查看各个进程的内存占用情况,发现其中一个 Java 进程的内存占用很高,其启动命令指定了最大的堆内存为 128M,但是整个进程占用的内存却有 550M,查看线程,发现这个进程开了3000个线程,简直惊了。...
  • linux查看内存cpu使用情况 top 查看所有进程内存和cpu占用情况; ps (查看线程对cpu占用情况)H -eo (需要的信息)pid,tid,%cpu ps H -eopid,tid,%cpu | grep 进程id(查看进程id的所有线程情况) ...
  • 最近生产环境经常发生CPU和内存异过高的情况,以前一般排查的也是一些死锁问题,排查死锁的时候直接打印程序的堆栈信息,然后查看线程的各种状态,差不多都能猜到问题所在,这两天cpu和内存问题刚开始也是直接打印...
  • iftop 查看带宽占用情况(总)yum install -y iftop 安装iftopnethogs 查看进程流量 curl http://218.5.73.233:8060/ip.php 查看出口ip 查看当前线程:ps -ef|grep javaps -ef|gerp com.meiya.main(包名) 1、...
  • Linux服务器java进程占用系统内存

    千次阅读 2019-01-04 09:26:49
    2.定位线程问题(通过命令查看9718进程的线程情况),命令:ps p 9718 -L -o pcpu,pmem,pid,tid,time,tname,cmd  由此可以看到这PID:9718的进程产生了很多线程。接下来就可以通过jstack...
  • 报错收到报警,swap空间占用过高,登录到系统查看内存使用详情,看到物理内存还有很多未使用问题分析Swap配置对性能的影响分配太多的Swap空间会浪费磁盘空间,而Swap空间太少,则系统会发生错误。如果系统的物理内存...
  • Linux进程线程命令

    2021-03-17 21:39:35
    Linux进程线程命令 进程是正在执行的一个程序或命令,每一个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源。 ps查看系统中所有进程 1)基本语法: ps –aux (功能描述:查看系统中所有进程...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 290
精华内容 116
关键字:

linux查看线程内存占用

linux 订阅