Linux下查看进程内存占用的技巧

1. 引言

在Linux系统中,进程的内存占用情况对于系统的性能和稳定性非常重要。因此,了解如何查看进程的内存占用情况是系统管理员和开发人员的基本技能之一。本文将介绍几种在Linux下查看进程内存占用的技巧和工具。

2. top命令

top命令是一个实时监测系统状态的工具,它可以列出当前运行的进程并显示它们的内存占用情况。

要使用top命令,只需要在终端中输入以下命令:

top

通过使用top命令,您可以查看系统中主要进程的内存占用情况。在top界面中,按下M键可以按内存占用排序进程。

以下是top命令输出的示例:

top - 09:32:16 up 70 days,  6:52,  2 users,  load average: 0.00, 0.01, 0.05

Tasks: 130 total, 1 running, 129 sleeping, 0 stopped, 0 zombie

%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

KiB Mem : 2048148 total, 1978048 free, 244328 used, 738192 buff/cache

KiB Swap: 524284 total, 524284 free, 0 used. 1704028 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

1 root 20 0 191968 15376 11996 S 0.0 0.8 2:09.29 systemd

2 root 20 0 0 0 0 S 0.0 0.0 0:00.11 kthreadd

3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp

...

在top命令输出的结果中,RES列表示进程实际使用的物理内存大小,%MEM列表示进程实际使用的物理内存占总内存的百分比。

3. ps命令

ps命令是另一个常用的查看进程信息的工具。它可以显示进程的详细信息,并包括进程的内存占用情况。

要使用ps命令,只需要在终端中输入以下命令:

ps aux

以下是ps命令输出的示例:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

root 1 0.0 0.4 191968 15376 ? Ss Oct24 2:09 /sbin/init

root 2 0.0 0.0 0 0 ? S Oct24 0:00 [kthreadd]

root 3 0.0 0.0 0 0 ? I< Oct24 0:00 [rcu_gp]

在ps命令输出的结果中,VSZ列表示进程的虚拟内存大小(以KB为单位),RSS列表示进程实际使用的物理内存大小(以KB为单位)。

3.1 ps命令的参数

ps命令支持许多不同的参数,可以根据需要选择使用不同的参数来显示特定进程的内存占用情况。

以下是一些常用的ps命令参数及其功能:

-e:显示所有进程。

-f:显示完整的进程信息。

-o:定义要显示的输出格式。

-p:只显示指定进程ID的信息。

-u:只显示指定用户的进程信息。

例如,要显示进程ID为1234的进程的内存占用情况,可以使用以下命令:

ps -p 1234 -o pid,%mem

以上命令将只显示进程ID为1234的进程的PID和%MEM两列。

4. pmap命令

pmap命令是一个比较底层的工具,它可以显示进程的内存映射情况。通过使用pmap命令,您可以查看进程的内存区域和每个区域的详细信息。

要使用pmap命令,只需要在终端中输入以下命令:

pmap PID

其中PID是要查看的进程的ID。

以下是pmap命令输出的示例:

          5555:   /usr/sbin/apache2 -k start

Address Kbytes RSS Dirty Mode Mapping

000055da6550a000 4 4 0 r--p 00000000 08:02 2496235 /usr/sbin/apache2

000055da655c5000 3568 2704 0 r-xp 00017000 08:02 2496235 /usr/sbin/apache2

000055da6585a000 264 132 96 r--p 0013b000 08:02 2496235 /usr/sbin/apache2

000055da6589a000 16 12 0 r--p 0017f000 08:02 2496235 /usr/sbin/apache2

000055da6589e000 12 8 8 rw-p 00183000 08:02 2496235 /usr/sbin/apache2

00007fc6daa66000 1436 868 0 r-xp 00000000 08:01 2986058 /lib/x86_64-linux-gnu/libc-2.27.so

...

在pmap命令输出的结果中,Kbytes列表示映射区域的大小(以KB为单位),RSS列表示实际使用的物理内存大小(以KB为单位),Dirty列表示已修改但尚未写回磁盘的内存大小(以KB为单位)。

5. smem命令

smem命令是一个用于统计系统内存使用情况的工具,它可以显示每个进程的内存使用情况。

要使用smem命令,只需要在终端中输入以下命令:

smem

以下是smem命令输出的示例:

  PID User     Command                         Swap      USS      PSS      RSS 

437583 mysql /usr/sbin/mysqld --daemoniz 0 256.0 Ki 332.0 Ki 92.0 Ki

387184 root /usr/sbin/apache2 -k start 0 236.0 Ki 332.0 Ki 84.0 Ki

387196 www-data /usr/sbin/apache2 -k start 0 244.0 Ki 316.0 Ki 68.0 Ki

387199 www-data /usr/sbin/apache2 -k start 0 244.0 Ki 316.0 Ki 68.0 Ki

387195 www-data /usr/sbin/apache2 -k start 0 244.0 Ki 316.0 Ki 68.0 Ki

...

在smem命令输出的结果中,Swap列表示交换空间的使用情况,USS列表示唯一的内存大小(仅占用该进程的内存),PSS列表示共享的物理内存大小,RSS列表示实际使用的物理内存大小。

5.1 smem命令的参数

smem命令支持许多不同的参数,可以根据需要选择使用不同的参数来显示特定进程的内存占用情况。

以下是一些常用的smem命令参数及其功能:

-u:只显示指定用户的进程信息。

-P:只显示指定进程的信息。

-s:按指定的列进行排序。

-r:以递减顺序显示结果。

例如,要只显示用户为mysql的进程的内存占用情况,可以使用以下命令:

smem -u mysql

以上命令将只显示用户为mysql的进程的内存占用情况。

6. 内存泄漏排查工具

在开发过程中,可能会出现内存泄漏问题,导致进程不断占用内存而不释放。为了排查这类问题,可以使用一些专门的工具。

6.1 valgrind

valgrind是一个用于检测内存错误和泄漏的工具,它可以帮助开发人员找出程序中的内存问题。

要使用valgrind,只需要在终端中输入以下命令:

valgrind --tool=memcheck --leak-check=full ./your_program

以上命令将使用valgrind检查名为your_program的可执行程序,并报告任何内存错误和泄漏。

valgrind的输出结果非常详细,会显示出每个分配和释放的内存区域的详细信息,以及可能的内存泄漏情况。

6.2 gdb

gdb是一个功能强大的调试器,可以在运行中的程序中设置断点并进行调试。

要使用gdb进行内存泄漏的排查,需要在编译程序时加上-g选项以启用调试信息。然后,在终端中输入以下命令启动gdb:

gdb ./your_program

在gdb中,可以使用命令如下:

(gdb) r

以上命令将启动可执行程序。

(gdb) b line_number

以上命令将在指定的行号设置断点。

然后,可以使用命令如下进行调试:

(gdb) c

以上命令将继续执行程序直到下一个断点。

使用gdb进行调试时,可以观察程序在运行时的内存使用情况,并尝试找出导致内存泄漏的代码。

7. 总结

本文介绍了几种在Linux下查看进程内存占用的技巧和工具。通过使用top、ps、pmap和smem命令,我们可以方便地查看进程的内存占用情况。此外,我们还介绍了valgrind和gdb这两个常用的内存泄漏排查工具。通过了解和使用这些工具,我们可以更好地监控和排查系统中的内存问题。

注意: 在使用排查工具时,请谨慎操作,并注意对关键进程进行备份。不当的操作可能导致系统稳定性问题。

操作系统标签