Как определить размер памяти во FreeBSD

Внезапно оказалось, что во FreeBSD нет способа быстро и наглядно посмотреть размер физической, свободной и занятой памяти. Вроде команды ‘free’ в линуксе. Интернет полон вопросами на этот счет и в ответ предлагается либо грепать дмесг:

# dmesg | grep memory
real memory  = 2147483648 (2048 MB)
avail memory = 2045009920 (1950 MB)
real memory  = 2147483648 (2048 MB)
avail memory = 2045009920 (1950 MB)

Либо ставить из портов ‘freecolor’:

# uname -omr
FreeBSD 9.0-RELEASE amd64
# cd /usr/ports/sysutils/freecolor/
freebsd# make install clean
===>  freecolor-0.8.8 is marked as broken: Does not function correctly on !i386.
*** Error code 1
Stop in /usr/ports/sysutils/freecolor.

Пичалька. Либо скачать и использовать вот этот перловый скрипт.

Ад и ненависть наполняет автора оригинального поста найденного мной тут, так как использовать пёрл для такой простой задачи — это нарушать KISS-принцип, ломать бритву Оккама лишней сущностью, а также просто фэйл. Плюс скрипт не обрабатывает ситуацию запуска из jail-а, что в наше время адской виртуализации всего — неприемлемо. Всяческие ‘top’ и ‘vmstat’ не велят использовать пауки, так как тоже лишняя сущность и в minimal install их нет.

Вобщем автор, портировал этот скрипт на язык, присутствующий в любой unix-системе (/bin/sh) и добавил обработку jail-a. Сохраните код ниже в какой-нибудь ‘/usr/bin/free’, сделайте ему ‘chmod a+x’ и наслаждайтесь.

#!/bin/sh

mem_phys=`sysctl -n hw.physmem`
mem_pgs=`sysctl -n hw.pagesize`
sys_jail=`sysctl -n security.jail.jailed`

# guess hardware memory size
chip_size=1
chip_guess=`expr $mem_phys / 8 - 1`
while [ $chip_guess -ne 0 ]; do
        chip_guess=`expr $chip_guess / 2`
        chip_size=`expr $chip_size \* 2`
done
mem_hw=`expr \( $mem_phys - 1 \) / $chip_size`
mem_hw=`expr $mem_hw \* $chip_size + $chip_size`

# determine the individual known information
mem_all=`sysctl -n vm.stats.vm.v_page_count`
mem_all=`expr $mem_all \* $mem_pgs`
mem_wire=`sysctl -n vm.stats.vm.v_wire_count`
mem_wire=`expr $mem_wire \* $mem_pgs`
mem_active=`sysctl -n vm.stats.vm.v_active_count`
mem_active=`expr $mem_active \* $mem_pgs`
mem_inactive=`sysctl -n vm.stats.vm.v_inactive_count`
mem_inactive=`expr $mem_inactive \* $mem_pgs`
mem_cache=`sysctl -n vm.stats.vm.v_cache_count`
mem_cache=`expr $mem_cache \* $mem_pgs`
mem_free=`sysctl -n vm.stats.vm.v_free_count`
mem_free=`expr $mem_free \* $mem_pgs`

# determine the individual unknown information
mem_gap_vm=`expr -- $mem_all - \( $mem_wire + $mem_active + $mem_inactive + $mem_cache + $mem_free \)`
mem_gap_sys=`expr -- $mem_phys - $mem_all`
mem_gap_hw=`expr -- $mem_hw - $mem_phys`

# determine logical summary information
mem_total=$mem_hw
mem_avail=`expr -- $mem_inactive + $mem_cache + $mem_free`
mem_used=`expr -- $mem_total - $mem_avail`

# print system results
printf "System memory information (page size is %d bytes)\n" $mem_pgs
if [ $sys_jail -eq 1 ]; then
        printf "WE ARE IN THE JAIL\n"
        printf "mem_wire:      %12d (%7dMB) %s\n" $mem_wire `expr -- $mem_wire / 1048576` 'Wired: disabled for paging out'
        printf "mem_active:    %12d (%7dMB) %s\n" $mem_active `expr -- $mem_active / 1048576` 'Active: recently referenced'
        printf "mem_inactive:  %12d (%7dMB) %s\n" $mem_inactive `expr -- $mem_inactive / 1048576` 'Inactive: recently not referenced'
        printf "mem_cache:     %12d (%7dMB) %s\n" $mem_cache `expr -- $mem_cache / 1048576` 'Cached: almost avail. for allocation'
        printf "mem_free:      %12d (%7dMB) %s\n" $mem_free `expr -- $mem_free / 1048576` 'Free: fully available for allocation'
        printf -- "-------------- ------------ -----------\n"
        printf "mem_phys:      %12d (%7dMB) %s\n" $mem_phys `expr -- $mem_phys  / 1048576` 'Total real memory available'
else
        printf "mem_wire:      %12d (%7dMB) [%3d%%] %s\n" $mem_wire `expr -- $mem_wire / 1048576` `expr -- $mem_wire \* 100 / $mem_all` 'Wired: disabled for paging out'
        printf "mem_active:  + %12d (%7dMB) [%3d%%] %s\n" $mem_active `expr -- $mem_active / 1048576` `expr -- $mem_active \* 100 / $mem_all` 'Active: recently referenced'
        printf "mem_inactive:+ %12d (%7dMB) [%3d%%] %s\n" $mem_inactive `expr -- $mem_inactive / 1048576` `expr -- $mem_inactive \* 100 / $mem_all` 'Inactive: recently not referenced'
        printf "mem_cache:   + %12d (%7dMB) [%3d%%] %s\n" $mem_cache `expr -- $mem_cache / 1048576` `expr -- $mem_cache \* 100 / $mem_all` 'Cached: almost avail. for allocation'
        printf "mem_free:    + %12d (%7dMB) [%3d%%] %s\n" $mem_free `expr -- $mem_free / 1048576` `expr -- $mem_free \* 100 / $mem_all` 'Free: fully available for allocation'
        printf "mem_gap_vm:  + %12d (%7dMB) [%3d%%] %s\n" $mem_gap_vm `expr -- $mem_gap_vm / 1048576` `expr -- $mem_gap_vm  \* 100 / $mem_all` 'Memory gap: UNKNOWN'
        printf -- "-------------- ------------ ----------- ------\n"
        printf "mem_all:     = %12d (%7dMB) [100%%] %s\n" $mem_all `expr -- $mem_all / 1048576` 'Total real memory managed'
        printf "mem_gap_sys: + %12d (%7dMB)        %s\n" $mem_gap_sys `expr -- $mem_gap_sys / 1048576` 'Memory gap: Kernel?!'
        printf -- "-------------- ------------ -----------\n"
        printf "mem_phys:    = %12d (%7dMB)        %s\n" $mem_phys `expr -- $mem_phys / 1048576` 'Total real memory available'
        printf "mem_gap_hw:  + %12d (%7dMB)        %s\n" $mem_gap_hw `expr -- $mem_gap_hw / 1048576` 'Memory gap: Segment Mappings?!'
        printf -- "-------------- ------------ -----------\n"
        printf "mem_hw:      = %12d (%7dMB)        %s\n" $mem_hw `expr -- $mem_hw / 1048576` 'Total real memory installed'
fi

# print logical results
if [ $sys_jail -ne 1 ]; then
        printf "\nSystem memory summary\n"
        printf "mem_used:      %12d (%7dMB) [%3d%%] %s\n" $mem_used `expr -- $mem_used / 1048576` `expr -- $mem_used \* 100 / $mem_total` 'Logically used memory'
        printf "mem_avail:   + %12d (%7dMB) [%3d%%] %s\n" $mem_avail `expr -- $mem_avail / 1048576` `expr -- $mem_avail \* 100 / $mem_total` 'Logically available memory'
        printf -- "-------------- ------------ ----------- ------\n"
        printf "mem_total:   = %12d (%7dMB) [100%%] %s\n" $mem_total `expr -- $mem_total / 1048576` 'Logically total memory'
fi

Пример вывода:

System memory information (page size is 4096 bytes)
mem_wire:        1384239104 (   1320MB) [ 67%] Wired: disabled for paging out
mem_active:  +     19644416 (     18MB) [  0%] Active: recently referenced
mem_inactive:+      4112384 (      3MB) [  0%] Inactive: recently not referenced
mem_cache:   +        36864 (      0MB) [  0%] Cached: almost avail. for allocation
mem_free:    +    654012416 (    623MB) [ 31%] Free: fully available for allocation
mem_gap_vm:  +       512000 (      0MB) [  0%] Memory gap: UNKNOWN
-------------- ------------ ----------- ------
mem_all:     =   2062557184 (   1967MB) [100%] Total real memory managed
mem_gap_sys: +     63373312 (     60MB)        Memory gap: Kernel?!
-------------- ------------ -----------
mem_phys:    =   2125930496 (   2027MB)        Total real memory available
mem_gap_hw:  +     21553152 (     20MB)        Memory gap: Segment Mappings?!
-------------- ------------ -----------
mem_hw:      =   2147483648 (   2048MB)        Total real memory installed

System memory summary
mem_used:        1489321984 (   1420MB) [ 69%] Logically used memory
mem_avail:   +    658161664 (    627MB) [ 30%] Logically available memory
-------------- ------------ ----------- ------
mem_total:   =   2147483648 (   2048MB) [100%] Logically total memory

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *