Pulseaudio 会泄漏内存吗?

klu*_*utt 6 memory top pulseaudio

我调用了top命令并得到了这个:

 PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                  
3433 klutt     20   0 4790760   1.0g 282208 S   8.3   4.2   1261:15 firefox-esr              
2063 klutt      9 -11 3424532  33644  24432 S   7.0   0.1 432:44.69 pulseaudio               
3681 klutt     20   0 3958364 545000 139800 S   6.6   2.2 434:35.72 Web Content       
Run Code Online (Sandbox Code Playgroud)

我知道 firefox 和 Web 内容正在使用大量内存,但是pulseaudio?使用超过 3GB 是否正常?这是一个错误吗?

$ uname -a
Linux desktop 5.7.0-1-amd64 #1 SMP Debian 5.7.6-1 (2020-06-24) x86_64 GNU/Linux

$ pulseaudio --version
pulseaudio 13.0

$ cat /etc/debian_version 
bullseye/sid
Run Code Online (Sandbox Code Playgroud)

And*_*ton 18

在您的示例中,pulseaudio使用的是 32MB 而不是 3GB。该RES列是物理内存。该VIRT列显示进程使用的所有虚拟内存。根据man top,这包括所有代码、数据和共享库以及已换出的页面和已映射但未使用的页面。

  • @Segfault 有时但并非总是如此。不过,在这种情况下,3G VSS 对 Pulseaudio 来说是正常的,它在启动时分配一大块内存,然后在内部进行自己的内存管理,以避免 `malloc()` 和 `free()` 的(极端)开销。对于内存管理密集型应用程序来说,这是一种相当标准的技术,因为 libc 提供的内存管理例程非常慢,因此需要在最坏情况下设置延迟上限。 (5认同)

jpa*_*jpa 7

您可以使用pmap工具查看有关虚拟内存使用情况的更多详细信息:

pmap $(pidof pulseaudio) | sort -hk 2

00005590f6f0a000      4K r---- pulseaudio
00005590f6f0b000      4K rw--- pulseaudio
00007f50ea53f000      4K r---- libicudata.so.66.1
00007f50ea540000      4K r-x-- libicudata.so.66.1
....
00007f50e0000000  65536K rw-s- memfd:pulseaudio (deleted)
00007f50f314b000  65536K rw-s- memfd:pulseaudio (deleted)
 total          1679768K
Run Code Online (Sandbox Code Playgroud)

对我来说,使用的大部分内存是 64MBmemfd缓冲区。memfd是进程间通信的一种方法,应用程序使用它来将音频数据传输到pulseaudio。

尽管为每个应用程序分配了缓冲区的虚拟内存,但实际内存仅用于当前传输的数据量。当应用程序将音频样本写入缓冲区时,会为其分配内存。一旦 pulsaudio 混合并播放了样本,内存将再次释放。