Memory

Pulseaudio 會洩漏記憶體嗎?

  • December 31, 2021

我呼叫了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       

我知道 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

在您的範例中,pulseaudio使用的是 32MB 而不是 3GB。該RES列是物理記憶體。該VIRT列顯示了程序使用的所有虛擬記憶體。根據man top,這包括所有程式碼、數據和共享庫以及已換出的頁面和已映射但未使用的頁面。

您可以使用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

對我來說,使用的大部分記憶體是 64MBmemfd緩衝區。memfd是程序之間通信的一種方法,應用程序使用它來將音頻數據傳輸到pulseaudio。

儘管為每個應用程序分配了緩衝區的虛擬記憶體,但實際記憶體僅用於目前傳輸的數據量。當應用程序將音頻樣本寫入緩衝區時,會為其分配記憶體。一旦 pulsaudio 混合併播放了樣本,記憶體就會再次被釋放。

引用自:https://unix.stackexchange.com/questions/599350