VIRT高是因為分配了太多地址空間導致。
一般來說不用太在意VIRT太高,因為你有16EB的空間可以使用。
如果你實在需要控制VIRT的使用,設置環境變量MALLOC_ARENA_MAX,例如:
hadoop推薦值為4,因為YARN使用VIRT值監控資源使用。
解決辦法就是:
export MALLOC_ARENA_MAX=1
原因:
如果應用程序每次分配內存的時候都通過系統調用 mmap,sbrk等來分配,效率會很低,所以glibc 中實現了一個內存池,應用程序使用內存的時候通過glibc的內存池來提供,早期的 glibc 版本中,只有一個內存池,稱為 main arena,在多線程場景中,每次分配和釋放需要進行加鎖。后來為了降低鎖的粒度,從glibc 2.10版本開始引入了 thread arena,線程在申請內存的時候,glibc 為他創建一個 thread arena,這個內存池的大小一般是64M,thread arena被不被某個線程獨占,全部的 thread arena被加入到環形鏈表,被所有線程共享使用。
環境變量 MALLOC_ARENA_MAX 用來控制進程可以創建的 thread arena 數量上限(默認為 cpu core*8),在 Hadoop 中這個值設置為 4,有人發現要設置為1,否則控制不住。其實這個值大於1時只是推薦值,1是強制值。
當設置為1,相當於禁用了 thread arena,arena_lookup每次都會返回 main arena, 不會創建任何 thread arena。