Skip to content

Instantly share code, notes, and snippets.

@knutov
Last active June 27, 2017 02:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save knutov/453fa860e4f574ac01413273cf79392f to your computer and use it in GitHub Desktop.
Save knutov/453fa860e4f574ac01413273cf79392f to your computer and use it in GitHub Desktop.

ext4 vs ext4 @ ZVOL ?

И сразу итоги

  • если ext4 на 480гб SSD диске, то доступно 440 гигабайт (16к на иноду)
  • если ext4 на 480гб SSD диске, то доступно 419 гигабайт (4к на иноду)
  • если просто ZFS то 430 гигабайт
  • если ext4 на ZVOL - 398 гигабайт (blocksize=4k)
  • если ext4 на ZVOL - 417 гигабайт (blocksize=16k)

ext4 на ZVOL нам нужно, потому что сжатие в 1.75-2.5 раза, а дедупликация большинства файлов в 100+ раз. При этом мы привязаны к OpenVZ, которое привязано к ext4.

Тестовый диск

Все тесты проводятся на 480 гб SSD диске.

# parted /dev/sda  unit s p free
Model: ATA INTEL SSDSC2BW48 (scsi)
Disk /dev/sda: 937703088s
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start       End         Size        Type     File system  Flags
        63s         2047s       1985s                Free Space
 1      2048s       937701375s  937699328s  primary
        937701376s  937703087s  1712s                Free Space

ext4 - свободное место

16к на иноду по умолчанию:

mkfs.ext4 -m 0 /dev/sda1 # default -i 16384

# df -h /vz3
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       440G   71M  440G   1% /vz3

А что если сделать 4k на иноду? У нас 65% файлов менее 1 килобайта

mkfs.ext4 -m 0 -i 4096 -b 4096 /dev/sda1

# df -h /vz3
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       420G   71M  419G   1% /vz3

zfs и ashift

Если не указывать ashift при создании, то будет ashift=0, означающий auto. И в данном случае это окажется ashift=9:

# zpool create -o vzpool /dev/sda1 

# zpool get all vzpool | grep ashift
vzpool  ashift                      0                           default

# zdb | grep ashift
            ashift: 9

Если просто ZFS

zpool create -o ashift=9 vzpool /dev/sda1 
zfs create -o mountpoint=/vz3  vzpool/private

# zfs list
NAME             USED  AVAIL  REFER  MOUNTPOINT
vzpool            95K   430G    19K  /vzpool
vzpool/private    19K   430G    19K  /vz3

zfs destroy vzpool/private
zpool destroy vzpool

Ок, если использовать просто ZFS - у нас 430 гигабайт. Если использовать сразу ext4 - у нас получалось 440 гигабайт.

ext4 на ZVOL с volblocksize=4k

zpool create -o ashift=12 vzpool /dev/sda1 

# zfs list
NAME     USED  AVAIL  REFER  MOUNTPOINT
vzpool   240K   430G    96K  /vzpool

Ничего не поменялось. Ок..

# zfs create -b 4096 -V 430G vzpool/vz3
cannot create 'vzpool/vz3': out of space
...
# zfs create -b 4096 -V 405G vzpool/vz3
cannot create 'vzpool/vz3': out of space

# zfs create -b 4096 -V 404G vzpool/vz3

И как я должен был угадать, что нужно именно 404G? Перебирать вручную каждый раз?

# zfs list
NAME         USED  AVAIL  REFER  MOUNTPOINT
vzpool       429G   692M    96K  /vzpool
vzpool/vz3   429G   430G    64K  -

Но как, как из 404 гигабайт получилось 429??? Мистика.

mkfs.ext4 -m 0 /dev/vzpool/vz3
mount /dev/vzpool/vz3 /vz3

# df -h /vz3
Filesystem      Size  Used Avail Use% Mounted on
/dev/zd0        398G   71M  398G   1% /vz3

398 гигабайт всего? Вместо 440. Печаль.

ext4 на ZVOL c volblocksize=16k

# zpool create vzpool /dev/sda1 

# zpool list
NAME     SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
vzpool   444G    64K   444G         -     0%     0%  1.00x  ONLINE  -

# zfs create -b 16384 -V 423G vzpool/vz3

# zfs list
NAME         USED  AVAIL  REFER  MOUNTPOINT
vzpool       430G   474M    19K  /vzpool
vzpool/vz3   430G   430G     8K  -

mkfs.ext4 -m 0 /dev/vzpool/vz3
mount /dev/vzpool/vz3 /vz3

# df -h /vz3
Filesystem      Size  Used Avail Use% Mounted on
/dev/zd0        417G   71M  417G   1% /vz3

При volblocksize=16k получаем 417 гигабайт ext4.

Средний размер файлов и их количество

Меня интересуют только мыши, их стоимость..

И сразу краткие итоги:

  • Средний размер маленького файла - чуть меньше 1 килобайта и таких файлов 65%
  • Средний размер вообще - 9 килобайт
  • Более 100 килобайт - средний размер ~500 килобайт и таких файлов 4%
  • Более одного мегабайта - средний размер 11 мегабайт и таких файлов ~0.15%

Сейчас все это лежит на SSD дисках c сектором в 512 байт на Ext4 c 16к байт на inode. На диске в 480 гигабайт (Типичный пример - Intel S3510)

mkfs.ext4 -m 0 /dev/sda1 # default -i 16384

Даст нам 440G доступного места. Если использовать 4 килобайта на иноду (что кажется логичнее), то свободного места на пустом диске будет меньше - 419G, но реально туда войдет, видимо, больше.

Как это считалось

Возьмем типичный маленький(!) хостинговый сервер (E3-1270v2/32 RAM/480 SSD).

  • 134 гигабайта диска использовано,
  • ~ 4 гигабайта на операционную систему и софт
  • ~ 4 гигабайта на еще не отротированные логи
  • ~ 8 гигабайт на базы MySQL
# du -hs /home
112G	/home

Далее будем считать только в /home.

Типичный аккаунт на хостинге, несколько сайтов на битриксе. Считаем средний размер файла

# find ./ -ls | awk '{sum += $7; n++;} END {print sum/n;}'
9282.64

А если клиент делает большие бекапы и хранит их локально? Считаем средний размер файла для всех аккаунтов на живом сервере

# find ./ -ls | awk '{sum += $7; n++;} END {print sum/n;}'
23173.1

Посчитаем количество файлов менее 4k и их средний размер на типичном аккаунте

# find ./ -type f -size -4096c -ls | awk '{sum += $7; n++;} END {print n; print sum/n;}'
153457
917.782

Посчитаем количество больших файлов ( > 100k ) на типичном сервере и их средний размер

# find ./ -type f -size +100k -ls | awk '{sum += $7; n++;} END {print n " files"; print sum/n " bytes average";}'
148090 files
535471 bytes average

Посчитаем файлы больше мегабайта

# find ./ -type f -size +1M -ls | awk '{sum += $7; n++;} END {print n " files"; print sum/n " bytes average";}'
4716 files
1.11516e+07 bytes average # 11151600 = ~11 мегабайт.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment