Нельзя просто так заставить разработчиков переписать сайт. Помощь FS-Cache в решении проблем кривого кода.

У одного из наших клиентов большой портал, данные которого хранятся на отдельном выделенном NFS сервере. На сегодняшний день — это множество изображений, которые хранятся в одном плоском каталоге и занимают более 3 TB. Даже листинг этого каталога занимает несколько десятков секунд. До недавнего времени все работало более-менее неплохо, но потом движок обновили и случилось чудо, нагрузка на хранилище выросла на порядок. Все наши увещевания, что было хорошо, стало плохо ни к чему не привели, разработчики просто разводят руками.

Одна из самых больших проблем — это плоская структура каталога, в котором хранятся все файлы, таким образом, операции, которым нужен листинг просто превращают хранилище в тыкву и 4x2TB RAID10 никак не справляются. На периоды пиковой нагрузки мы переносили данные клиенты на наше SSD-хранилище, чтобы преодолеть проблему.

Новый виток боли начался недавно — у клиента стало заканчиваться место в хранилище, мы выполнили перенос на временный сервер, но проблема усугубилась — после перемонтирования хранилища NFS IOPS-ы стали зашкаливать, так как сервер приложений выкачивал все данные непосредственно с хранилища, и система просто встала колом. К счастью, на сервере приложений было около 500 GB высокоскоростного пространства на SSD и мы решили попробовать использовать FS-Cache для решения проблемы. Это был первый опыт применения данной технологии, но делать было нечего, все равно ничего не работало.

FS-Cache позволяет кэшировать операции чтения с помощью кэширующего устройства. Часто использование FS-Cache рекомендуется вместе с NFS, что как раз было нашим случаем. Итак, начинаем смотреть как это использовать.

Проверяем совместимость ядра

# grep CONFIG_NFS_FSCACHE /boot/config-3.13.0-147-generic
CONFIG_NFS_FSCACHE=y

Отлично, ядро пересобирать не надо.

Монтируем NFS с нужным параметром FSC

server://files /mnt/vgslow-data nfs nfsvers=4,async,rw,_netdev,fsc 0 0

Обращаем внимание. Перемонтирование через remount не даст эффекта. Необходимо отмонтировать и смонтировать с параметром «fsc».

Устанавливаем и настраиваем демон кэширования

apt-get install cachefilesd

Редактируем настройки

# cat /etc/cachefilesd.conf 
###############################################################################
#
# Copyright (C) 2006,2010 Red Hat, Inc. All Rights Reserved.
# Written by David Howells (dhowells@redhat.com)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version
# 2 of the License, or (at your option) any later version.
#
###############################################################################

dir /var/cache/fscache
tag mycache
brun 10%
bcull 7%
bstop 3%
frun 10%
fcull 7%
fstop 3%

# Assuming you're using SELinux with the default security policy included in
# this package
# secctx system_u:system_r:cachefiles_kernel_t:s0

В настройках мы изменили только параметр dir. Остальные параметры оставлены по умолчанию. Демон умеет определять доступное место на диске и держать его на заданных уровнях.

Указываем, что демон должен запускаться:

# cat /etc/default/cac
cacerts cachefilesd 
root@np0121:~# cat /etc/default/cachefilesd 
# Defaults for cachefilesd initscript
# sourced by /etc/init.d/cachefilesd

# You must uncomment the run=yes line below for cachefilesd to start.
# Before doing so, please read /usr/share/doc/cachefilesd/howto.txt.gz as
# extended user attributes need to be enabled on the cache filesystem.
RUN=yes

# Additional options that are passed to the Daemon.
DAEMON_OPTS=""

Запускаем сервис

service cachefilesd start

Проверяем работоспособность

# cat /proc/fs/nfsfs/volumes
NV SERVER   PORT DEV  FSID             FSC
v4 b078194a 801  0:35 16f9381700e59eda yes

Важно, чтобы в колонке FSC было yes. Это означает, что кэширование активировалось.

Теперь смотрим статистику кэша:

# cat /proc/fs/fscache/stats
FS-Cache statistics
Cookies: idx=6 dat=1890275 spc=0
Objects: alc=1097490 nal=0 avl=1097490 ded=1016804
ChkAux : non=0 ok=171729 upd=0 obs=0
Pages : mrk=148687337 unc=145492607
Acquire: n=1890281 nul=0 noc=0 ok=1890281 nbf=0 oom=0
Lookups: n=1097490 neg=925761 pos=171729 crt=925761 tmo=0
Invals : n=0 run=0
Updates: n=0 nul=0 run=0
Relinqs: n=1759445 nul=0 wcr=0 rtr=0
AttrChg: n=0 ok=0 nbf=0 oom=0 run=0
Allocs : n=0 ok=0 wt=0 nbf=0 int=0
Allocs : ops=0 owt=0 abt=0
Retrvls: n=2393196 ok=465345 wt=723800 nod=1927851 nbf=0 int=0 oom=0
Retrvls: ops=2393196 owt=662915 abt=0
Stores : n=118288880 ok=118288880 agn=0 nbf=0 oom=0
Stores : ops=2049040 run=120337487 pgs=118288447 rxd=118288880 olm=0
VmScan : nos=145461870 gon=0 bsy=0 can=433 wt=11
Ops : pend=662994 run=4442236 enq=153450538 can=0 rej=0
Ops : dfr=36586 rel=4442236 gc=36586
CacheOp: alo=0 luo=0 luc=0 gro=0
CacheOp: inv=0 upo=0 dro=0 pto=0 atc=0 syn=0
CacheOp: rap=0 ras=0 alp=0 als=0 wrp=0 ucp=0 dsp=0

Если счетчики двигаются, значит все ОК, настройка завершена.

Заключение

Нам повезло, что нагрузка клиента в основном представляет собой операции чтения, что позволяет использовать FS-Cache совместно с NFS. Если бы проблема была в нагрузке по записи, мы бы не смогли эффективно воспользоваться данной технологией.