Linux: работа с памятью и дисками du, df, tree, free, fsck, newfs, partition, paging, swapping, commit/active/available, iotop/iostat/lsof

Du

du (disk usage) — стандартная Unix программа для оценки занимаемого файлового пространства.

du -h / | sort -h – ищем объемные файлы/папки во всей системе и сортируем по возрастанию.

du -sh /var/www/localhost/htdocs/w/ – узнать размер папок и вложений

~$ du -sh /var/www/cacti/
1,1G    /var/www/cacti/

~$ du -sh /var/www/w/
94M     /var/www/w/

~$ du -sh /var/www/localhost/
708K    /var/www/localhost/

du -s * | sort –n – узнать размер каждой папки и файла относительно нашей (*) и отсортировать по размеру. Ключ –s позволяет показывать только общий размер папки, не показывая размер каждого файла внутри папки.

du -s * | sort -n | cut -f 2|while read a;do du -hs $a;done >1 – отображение в удобной форме для человеческого глаза (H) с выводом в мегабитах/мегабайтах.

du+diff

Если сервак начинает заполняться по памяти и непонятно кто память заполняет можно проанализировать размер файлов через  du во всех папках пару раз и потом diff’ом поискать какие папки изменились.

~$ diff 2_1 2_2
236,237c236,237
< 4186296       tftpd
< 4686866       tools
---
> 4186664       tftpd
> 4687674       tools
Df

df (disk free) — утилита в UNIX и UNIX-подобных системах, показывает список всех файловых систем по именам устройств, сообщает их размер, занятое и свободное пространство и точки монтирования. Последняя колонка (Смонтировано в) показывает за какие директории отвечает данный образ.

Ключ h или humanreadable отобразит размер в человеко-читабельном формате.

$ df -h 
Файл.система   Размер Использовано  Дост Использовано% Cмонтировано в
/dev/sda1        7,3G         6,0G  964M           87% /
none             4,0K            0  4,0K            0% /sys/fs/cgroup
udev             233M         4,0K  233M            1% /dev
tmpfs             49M         436K   49M            1% /run
none             5,0M            0  5,0M            0% /run/lock
none             245M            0  245M            0% /run/shm
none             100M            0  100M            0% /run/user
/dev/sdb1         83G         4,2G   75G            6% /usr/data

df -T – добавляем столбец с типом файловой системы. Напр. ext4 считается неплохой FS до сих пор ((поэтому и используется по умолчанию во многих дистрибутивах Linux)), но при большом количестве файлов можно кастомизировать по до что-то другое.

$ df -T
Filesystem Type 1K-blocks Used Available Use% Mounted on
udev devtmpfs 8141220 0 8141220 0% /dev
tmpfs tmpfs 1632300 43888 1588412 3% /run
/dev/sda1 ext4 959395920 9435020 901156500 2% /
tmpfs tmpfs 8161484 0 8161484 0% /dev/shm
tmpfs tmpfs 5120 0 5120 0% /run/lock
tmpfs tmpfs 8161484 0 8161484 0% /sys/fs/cgroup
tmpfs tmpfs 1632296 0 1632296 0% /run/user/0

df -i – смотрим количество Inode (used, free, %) – индексных дескриптеров файлов (метаинформация)

$ df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdb1 8483456 8483456 0 100% /home
tree

tree – утилита для просмотра вложенных папок и файлов относительно текущей папки. По сути родственник du. С опциями -hs можно посмотреть размер файлов в понятном виде, с опцией -d можно посмотреть только директории.

 

IOTOP/IOSTAT/lSOF
  • iotop – какие процессы в настоящее время создают нагрузку на диск, пример вывода при загрузке большого файла на диск, причем если загружать в /dev/null загрузки диска не будет 🙂
apt install iotop

wget https://speedtest.selectel.ru/10GB
iotop

TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
24043 be/4 root 0.00 B/s 0.00 B/s 0.00 % 95.10 % [kworker/u4:1+flush-8:0]
240 be/3 root 0.00 B/s 3.76 K/s 0.00 % 68.68 % [jbd2/sda1-8]
23297 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.02 % [kworker/1:1-events]

wget -O /dev/null https://speedtest.selectel.ru/10GB
  • iostat – в расширенном выводе можно посмотреть как загружен диск в %util (до 100%), по принципу своего расчета это “как часто диск был занят когда он был нужен“. Внимание – в базовом выводе в первые строки зачем то добавили информацию о загрузке CPU и невнимательный может подумать, что это относится к дискам.
apt install sysstat
# iostat
Linux 4.19.0-16-amd64 (spr) 12/09/23 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.01 0.00 0.00 0.01 0.00 99.98
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
fd0 0.00 0.00 0.00 8 0
sda 0.02 0.09 0.34 249987 902224
# iostat -x -d
Linux 4.19.0-16-amd64 (spr) 12/09/23 _x86_64_ (2 CPU)
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
fd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 65.00 0.00 0.00 4.00 0.00 66.00 0.00
sda 0.00 0.02 0.09 0.35 0.00 0.02 0.59 60.43 9.36 23.74 0.00 26.12 23.15 7.29 0.01

https://stackoverflow.com/questions/4458183/how-the-util-of-iostat-is-computed
Percentage of CPU time during which I/O requests were issued to the device (band-width utilization for the device). Device saturation occurs when this value is close to 100%.

[%util is] how much time did the storage device have outstanding work (was busy).

 

Free

В контексте оперативной памяти есть понятие страниц – huge pages, page merging (USKM, который ускоряет использование RAM для CPU путем дедупликации памяти) и прочих вещей, связанных с pages.

Most current CPU architectures support bigger pages (so the CPU/OS have less entries to look-up), those are named Huge pages (on Linux), Super Pages (on BSD) or Large Pages (on Windows), but it all the same thing.

Free -h – утилита для просмотра занятости RAM, cache, SWAP памяти. 

~$ free
             total       used       free     shared    buffers     cached
Память:     501644     492448       9196         84      14916     176676
-/+ буферы/кэш:     300856     200788
Swap:       522236     491192      31044

~$ free -h
             total       used       free     shared    buffers     cached
Mem:          2,0G       1,8G       205M        32K       141M       953M
-/+ buffers/cache:       700M       1,3G
Swap:         2,0G       561M       1,5G

Утилита free показывает именно доступную для использования память, а не весь её физический объём.

В Centos/RHEL если заглянуть в dmesg, можно увидеть следующие записи:

~$ dmesg|grep Reserving
[ 0.000000] Reserving 161MB of memory at 688MB for crashkernel (System RAM: 2047MB)
~$ dmesg|grep Memory
[ 0.000000] Memory: 1860532k/2097140k available (7348k kernel code, 400k absent, 236208k reserved, 6281k data, 1844k init)

То есть, часть памяти резервируется операционной системой под свои нужны (kdump) в самом начале загрузки, поэтому цифра во free получается несколько меньше, чем ожидается.

При базовом сценарии использования памяти (без i/o устройств которым для включения нужны большие непрерывные участки hardware memory, которые могут быть недоступны из-за фрагментации) в Linux полагаться надо на available или free + cached + buffered, когда available нет (менее точно т.к. не все участки cached+ buffered reclaimable/swappable из-за того, что они могут использоваться прямо сейчас). НЕЛЬЗЯ ПОЛАГАТЬСЯ ТОЛЬКО НА FREE.

При этом признаками утечки памяти (memory leak) могут быть два индикатора (особенно, если они сопряжены с уменьшением available памяти):

    • уменьшения тренда по available
    • рост commit (kbcommit) – более явно т.к. эта память не возвращается в систему до тех пор, пока она не будет освобождена при этом на практике free по memavaliable может считать, что занятая commit память доступна для системы и других процессов!
https://www.ciscolive.com/c/dam/r/ciscolive/us/docs/2018/pdf/BRKARC-3146.pdf
Memory Utilization Alarms
Committed memory > 95% for warnings
Committed memory > 99% for critical errors 
    • рост active (kbactive) – менее явно, но все равно крайне подозрительно т.к. она reclaime’ится в последнюю очередь
    • https://man7.org/linux/man-pages/man1/sar.1.html
      kbactive
                           Amount of active memory in kilobytes (memory that
                           has been used more recently and usually not
                           reclaimed unless absolutely necessary).
      kbcommit
                           Amount of memory in kilobytes needed for current
                           workload.  This is an estimate of how much RAM/swap
                           is needed to guarantee that there never is out of
                           memory.
https://www.linuxatemyram.com/
available - Estimation of how much memory is available for starting new applications, without swapping. Unlike the data provided by the cache or free fields, this field takes into account page cache and also that not all reclaimable memory slabs will be reclaimed due to items being in use (MemAvailable in /proc/meminfo, available on kernels 3.14, emulated on kernels 2.6.27+, otherwise the same as free)

How do I stop Linux from doing this?

You can't disable disk caching. The only reason anyone ever wants to disable disk caching is because they think it takes memory away from their applications, which it doesn't! Disk cache makes applications load faster and run smoother, but it NEVER EVER takes memory away from them! Therefore, there's absolutely no reason to disable it!

How do I see how much free ram I really have?

To see how much ram your applications could use without swapping, run free -m and look at the "available" column:

$ free -m
 total     used        free      shared  buff/cache   available
Mem: 1504   1491          13     0         855      792
Swap: 2047    6        2041

(On installations from before 2016, look at "free" column in the "-/+ buffers/cache" row instead.)

This is your answer in MiB. If you just naively look at "used" and "free", you'll think your ram is 99% full when it's really just 47%!

To calculate free memory value with SAR, use the below formula:

kbmemfree + kbbuffers + kbcached = actual free memory on the system

Warning signs of a genuine low memory situation that you may want to look into:

- available memory (or "free + buffers/cache") is close to zero
- swap used increases or fluctuates

 

 

PAGING, SWAPPING

По сути PAGING и SWAPPING одно и то же – перемещение участков памяти из RAM на HDD/SSD. Даже в рамках одного предложения можно встретить использование и swapping и paging как одного, пример Oracle. При этом для современных ОС актуален термин paging. Swapping/paging – нежелательное для стабильной производительности приложения поведение системы и его нужно по возможности избегать – напр. отключать использование swapping (swappiness).

Swapping can have a significant impact on Coherence's performance and should be avoided. Often, swapping manifests itself as Coherence nodes being removed from the cluster due to long periods of unresponsiveness caused by them having been swapped out of RAM. See "Avoid using virtual memory (paging to disk)." for more information. To avoid swapping, ensure that sufficient RAM memory is available on the computer or that the number of running processes is accounted for and do not consume all the available RAM. Tools such as vmstat and top (on Unix and Linux) and taskmgr (on Windows) should be used to monitor swap rates.

Linux, by default, may choose to swap out a process or some of its heap due to low usage even if it is not running low on RAM. Swappiness is performed to be ready to handle eventual memory requests. Swappiness should be avoided for Coherence JVMs. The swappiness setting on Linux is a value between 0 and 100, where higher values encourage more optimistic swapping. The default value is 60. For Coherence, a lower value (0 if possible) should always be set.

echo 0 > /proc/sys/vm/swappiness

To set the value permanently, modify the /etc/sysctl.conf file as follows:
vm.swappiness = 0
Jan did a great job explaining in detail but if you just want a birds eye difference here is what each does notice the bold font to indicate the main difference.

Paging: is when individual memory segments, or pages, are moved to or from the swap area/swap partition

Swapping: is when entire processes were swapped and moved to or from the swap area/swap partition

Подкачка страниц (англ. paging; иногда используется термин swapping от swap/swɔp/) — один из механизмов виртуальной памяти, при котором отдельные фрагменты памяти (обычно неактивные) перемещаются из ОЗУ во вторичное хранилище (жёсткий диск или другой внешний накопитель, такой как флеш-память), освобождая ОЗУ для загрузки других активных фрагментов памяти. Такими фрагментами в современных ЭВМ являются страницы памяти.

Paging — это процесс, при котором Linux делит свою физическую оперативную память на куски фиксированного размера (4 КБ), называемые страницами (англ. «pages»).

Swapping (или «подкачка памяти») — это процесс, при котором страница памяти копируется в специальное пространство на жестком диске, называемое пространством подкачки (англ. «swap space»), освобождая занимаемый ею объем оперативной памяти. В Linux для этого существует специальная программа — менеджер памяти.
    • Каждый раз, когда системе требуется больше памяти, чем ей физически доступно в данный момент, менеджер памяти ищет все редко используемые страницы памяти и вытесняет их на жесткий диск, предоставляя освободившуюся память другому приложению (процессу).
    • Часто случается так, что приложение в момент своего старта задействует существенное количество страниц памяти, которые в дальнейшем ему больше не потребуются. В таких случаях операционная система также может произвести вытеснение подобных страниц памяти на диск, освободив тем самым память для других приложений (или даже для дискового кэша).
Создание SWAP раздела и его использование (на примере CentOS 7)

Если система должна одинаково быстро возвращать любые данные – SWAP лучше не использовать, а мониторить и расширять по данным мониторинга ОП.

Создал SWAP 2GB (по размеру RAM). Поправил права (чтобы только root мог прочитать содержимое), включил и добавил в автозагрузку. Проверил, что все ок (после перезагрузки).

~$ sudo dd if=/dev/zero of=/swapfile count=2048 bs=1MiB
[sudo] password for admin:
2048+0 records in
2048+0 records out
2147483648 bytes (2.1 GB) copied, 7.08322 s, 303 MB/s

~$ ls -lh /swapfile
-rw-r--r-- 1 root root 2.0G Mar 28 23:59 /swapfile

~$ sudo chmod 600 /swapfile

~$ ls -lh /swapfile
-rw------- 1 root root 2.0G Mar 28 23:59 /swapfile

~$ sudo mkswap /swapfile
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=772c8158-60d8-4877-a232-3b49d724f3d9

~$ sudo swapon /swapfile

~$ swapon -s
Filename Type Size Used Priority
/swapfile file 2097148 0 -2

~$ free -m
total used free shared buff/cache available
Mem: 1837 568 76 88 1192 1017
Swap: 2047 0 2047

~$ sudo vi /etc/fstab
# add line
/swapfile swap swap sw 0 0

 

OOM – out of memory

Сталкивался с OOM при генерации левых процессов без таймаута.

Проблемы были довольно серьезные – перестала работать база и ряд скриптов, причем как ruby, так и sh. Мониторинг процессов это очень важно 🙂

Jun 19 10:37:05 tests kernel: [25790395.418410] Out of memory: Kill process 1335 (mysqld) score 48 or sacrifice child
Jun 19 10:37:05 tests kernel: [25790395.418625] Killed process 1335 (mysqld) total-vm:1344232kB, anon-rss:177676kB, file-rss:0kB
Jun 19 10:37:05 tests kernel: [25790395.551433] init: mysql main process (1335) killed by KILL signal
Jun 19 10:37:05 tests kernel: [25790395.551470] init: mysql main process ended, respawning

ip_monitoring.rb:9:in ``': Cannot allocate memory - grep 10.225.12.114 ' (Errno::ENOMEM)


sql-oracle_sync.rb:19:in ``': Cannot allocate memory - curl "http://localhost:1301/cgi-bin/sendsms?

Leave a Reply