четвер, 18 серпня 2011 р.

Квоти в Lustre

Аналогічно до попередніх постів:
цей пост не претендує на вичерпність, є спрощеним варіантом HOWTO, та швидше стосується невеликих систем, які при потребі можна відносно безболісно вимкнути як ціле на якийсь час.

Отож, квоти. Річ, яка допомагає адміністраторам не допускати несправедливості, а користувачам контролювати свої пориви :-)

Детально про квоти в Lustre описано в  "21. Configuring and Managing Quotas" (Lustre 2.0 Operations Manual). Однак, там трапляються доволі грубі помилки. Одна з них -- для ввімкнення квот на MDS Lustre 2.0 слід писати mdd.quota_type (!) а не mds.quota_type. При чому, якщо написати не те, то помилки будуть дуже дивними, поведінка - непослідовною. (Аж до того, що іноді MDT монтуватиметься, а іноді - ні).


Деяка загальна інформація про них:
  • Обмежуватися може як об'єм, так і кількість inode (грубо - кількість файлів та інших об'єктів файлової системи (ФС))
  • Квоти можуть існувати як для окремих користувачів, так і для їх груп.
  • Квоти розподілені, як і сама ФС.
  • Клієнтські usrquota та grpquota ніякої ролі не грають, всім клієнтам нав'язуються ті ж самі квоти.
  • Квоти для root не "змушуються".
  • Керування квотами здійснюється за допомогою lfs, після монтування ФС.
 1. Ввімкнення квот

1.1 Перевірка наявності модуля lquotes

[root@mds ~]# lsmod | grep lquota
lquota                233416  5 mdd
ptlrpc               1094728  13 cmm,mdt,mdd,mds,mgs,mgc,lustre,lov,osc,lquota,mdc,fid,fld
obdclass              853672  33 cmm,osd_ldiskfs,mdt,mdd,mds,fsfilt_ldiskfs,mgs,mgc,lustre,lov,osc,lquota,mdc,fid,fld,ptlrpc
lvfs                   81976  18 cmm,osd_ldiskfs,mdt,mdd,mds,fsfilt_ldiskfs,mgs,mgc,lustre,lov,osc,lquota,mdc,fid,fld,ptlrpc,obdclass
libcfs                256552  20 cmm,osd_ldiskfs,mdt,mdd,mds,fsfilt_ldiskfs,mgs,mgc,lustre,lov,osc,lquota,mdc,fid,fld,ksocklnd,ptlrpc,obdclass,lnet,lvfs

[root@ossX ~]# lsmod | grep lquota
lquota                233416  5 obdfilter
ptlrpc               1094728  10 obdfilter,ost,mgc,lustre,lov,osc,lquota,mdc,fid,fld
obdclass              853672  28 obdfilter,fsfilt_ldiskfs,ost,mgc,lustre,lov,osc,lquota,mdc,fid,fld,ptlrpc
lvfs                   81976  14 obdfilter,fsfilt_ldiskfs,ost,mgc,lustre,lov,osc,lquota,mdc,fid,fld,ptlrpc,obdclass
libcfs                256552  16 obdfilter,fsfilt_ldiskfs,ost,mgc,lustre,lov,osc,lquota,mdc,fid,fld,ksocklnd,ptlrpc,obdclass,lnet,lvfs

1.2 Розмонтування.

Цього кроку, особливо на великих системах, можна уникнути. Але, для простоти, розмонтовуємо всі клієнти, всі сервери у наступному порядку: OSS, MDT i MGS.

1.3 Конфігурування підтримки квот

На MDS виконуємо команду tunefs.lustre --param mdd.quota_type=ug /dev/<mdt_device> --writeconf.
  • --writeconf очищає деякі внутрішні логи Lustre, можливо в даному випадку і не є необхідним.
  • Слід писати саме --param mdd.quota_type=ug, в документації, станом на середину серпня 2011, є помилка! (Стосується версії Lustre 2.0).
  • ug вказує на використання квот для u(sers) i g(roups) -- користувачів та груп. 
  • Можливим є вказання версії файла квот (ug1, ug2), але зазвичай це не є потрібним.
Увага! Якщо квоти вже так чи інакше вмикалися, (а це можна побачити, виконавши, наприклад, вищевказану команду із ключем --dryrun), то для зміни параметра  mdd.quota_type слід користуватися опцією erase-params. Причина в тому, що команда, записана вище, просто додасть ще один параметр, а не замістить старий. Користуватися erase-params слід обережно, бо вона стирає ВСІ попередні параметри. Виглядатиме це так:

[root@mgs ~]# tunefs.lustre --writeconf --erase-param  --mgsnode=192.168.1.123@tcp --param=mdd.quota_type=ug /dev/md4
checking for existing Lustre data: found CONFIGS/mountdata
Reading CONFIGS/mountdata

   Read previous values:
Target:     lustre0-MDT0000
Index:      0
Lustre FS:  lustre0
Mount type: ldiskfs
Flags:      0x1
              (MDT )
Persistent mount opts: iopen_nopriv,user_xattr,errors=remount-ro
Parameters: mgsnode=192.168.1.123@tcp

   Permanent disk data:
Target:     lustre0-MDT0000
Index:      0
Lustre FS:  lustre0
Mount type: ldiskfs
Flags:      0x141
              (MDT update writeconf )
Persistent mount opts: iopen_nopriv,user_xattr,errors=remount-ro
Parameters: mgsnode=192.168.1.123@tcp mdd.quota_type=ug

Як було видно із секції "Read previous values:", ніяких параметрів, крім mgsnode не існувало, тому вказуємо тільки його: --mgsnode=192.168.1.123@tcp.

Наступний крок -- ввімкнення підтримки квот на всіх OSS. (Не "запускайте" Люстру, де тільки частина OSS/MDS має ввімкнені квоти, результати можуть бути несподівані). Команда -- аналогічна, "tunefs.lustre --param ost.quota_type=ug /dev/md4 --writeconf". На цей раз без сюрпризів -- ost він і є ost. Аналогічно, якщо спроба вмикати квоти вже була, слід користуватися --erase-params та результатами роботи з ключем --dryrun, щоб відновити всі параметри системи.

Наприклад:

[root@ossX ~]# tunefs.lustre --writeconf --dryrun /dev/md4
checking for existing Lustre data: found CONFIGS/mountdata
Reading CONFIGS/mountdata

   Read previous values:
Target:     lustre0-OST0000
Index:      0
Lustre FS:  lustre0
Mount type: ldiskfs
Flags:      0x2
              (OST )
Persistent mount opts: errors=remount-ro,extents,mballoc
Parameters: mgsnode=192.168.1.123@tcp failover.mode=failout


   Permanent disk data:
Target:     lustre0-OST0000
Index:      0
Lustre FS:  lustre0
Mount type: ldiskfs
Flags:      0x102
              (OST writeconf )
Persistent mount opts: errors=remount-ro,extents,mballoc
Parameters: mgsnode=192.168.1.123@tcp failover.mode=failout

exiting before disk write.
Завдяки --dryrun реальних змін у ФС не внесено: "exiting before disk write.".

Бачимо два параметри: "Parameters: mgsnode=192.168.1.123@tcp failover.mode=failout", які і слід вказати заново.

[root@ossX ~]# tunefs.lustre --writeconf --erase-param  --mgsnode=192.168.1.123@tcp \
--param="ost.quota_type=ug" --param="failover.mode=failout" /dev/md4
checking for existing Lustre data: found CONFIGS/mountdata
Reading CONFIGS/mountdata

   Read previous values:
Target:     lustre0-OST0000
Index:      0
Lustre FS:  lustre0
Mount type: ldiskfs
Flags:      0x142
              (OST update writeconf )
Persistent mount opts: errors=remount-ro,extents,mballoc
Parameters: mgsnode=192.168.1.123@tcp mdd.quota_type=ug failover.mode=failout


   Permanent disk data:
Target:     lustre0-OST0000
Index:      0
Lustre FS:  lustre0
Mount type: ldiskfs
Flags:      0x142
              (OST update writeconf )
Persistent mount opts: errors=remount-ro,extents,mballoc
Parameters: mgsnode=192.168.1.123@tcp ost.quota_type=ug failover.mode=failout

Writing CONFIGS/mountdata

Після цього всі цільові пристрої -- MDT, OST, успішно монтуватимуться. Однак, люстра, як ціле, не працюватиме. Щоб виправити це, слід виконати, на розмонтованих цільових пристроях MGS, MDT, OST: tunefs.lustre --writeconf /dev/<device>. Причина цього мені невідома та незрозуміла -- writeconf і так робився під час задання параметрів. (Можливо, достатньо цей крок зробити на MGS?... )

[root@mgs ~]# tunefs.lustre --writeconf /dev/md3
checking for existing Lustre data: found CONFIGS/mountdata
Reading CONFIGS/mountdata

   Read previous values:
Target:     MGS
Index:      unassigned
Lustre FS:  lustre
Mount type: ldiskfs
Flags:      0x74
              (MGS needs_index first_time update )
Persistent mount opts: iopen_nopriv,user_xattr,errors=remount-ro
Parameters:


   Permanent disk data:
Target:     MGS
Index:      unassigned
Lustre FS:  lustre
Mount type: ldiskfs
Flags:      0x174
              (MGS needs_index first_time update writeconf )
Persistent mount opts: iopen_nopriv,user_xattr,errors=remount-ro
Parameters:

Writing CONFIGS/mountdata
[root@mds ~]# tunefs.lustre --writeconf /dev/md4
checking for existing Lustre data: found CONFIGS/mountdata
Reading CONFIGS/mountdata

   Read previous values:
Target:     lustre0-MDT0000
Index:      0
Lustre FS:  lustre0
Mount type: ldiskfs
Flags:      0x1
              (MDT )
Persistent mount opts: iopen_nopriv,user_xattr,errors=remount-ro
Parameters: mgsnode=192.168.1.123@tcp mdd.quota_type=ug


   Permanent disk data:
Target:     lustre0-MDT0000
Index:      0
Lustre FS:  lustre0
Mount type: ldiskfs
Flags:      0x101
              (MDT writeconf )
Persistent mount opts: iopen_nopriv,user_xattr,errors=remount-ro
Parameters: mgsnode=192.168.1.123@tcp mdd.quota_type=ug

Writing CONFIGS/mountdata

[root@ossX ~]# tunefs.lustre --writeconf  /dev/md4 
checking for existing Lustre data: found CONFIGS/mountdata
Reading CONFIGS/mountdata

   Read previous values:
Target:     lustre0-OST0000
Index:      0
Lustre FS:  lustre0
Mount type: ldiskfs
Flags:      0x2
              (OST )
Persistent mount opts: errors=remount-ro,extents,mballoc
Parameters: mgsnode=192.168.1.123@tcp ost.quota_type=ug failover.mode=failout


   Permanent disk data:
Target:     lustre0-OST0000
Index:      0
Lustre FS:  lustre0
Mount type: ldiskfs
Flags:      0x102
              (OST writeconf )
Persistent mount opts: errors=remount-ro,extents,mballoc
Parameters: mgsnode=192.168.1.123@tcp ost.quota_type=ug failover.mode=failout

Writing CONFIGS/mountdata

На завершення, всі сервери та принаймні один клієнт (бажано на іншому вузлі) слід змонтувати.

1.4 Активація квот
  1. Монтуємо Lustre, але так, щоб не допускати її змін (читати - можна). (Тобто, наприклад, на координуючій машині Rocks її можна змонтувати read-only - щоб користувачі мали доступ до своїх файлів на час генерації квот, а на одному з вузлів і для запису. Всі роботи проводити з цього вузла. Не забуваємо, що окремі програми пишуть "мимоволі" - бекапи текстових редакторів, конфігурації та "локи" багатьох інших і т.д.)
  2. Виконуємо lfs quotacheck -ug /lustre0 На заповненій ФС процес тривалий! Хоча, багато швидший ніж "du".
  3. Вмикаємо квоти: lfs quotaon -ug /lustre0/
  4. Тепер можна встановити квоти для конкретних користувачів.
Встановлення квот здійснюється так:

lfs setquota -u username -b 209715200 -B 262144000 -i 2000000 -I 2001000 /lustre0
Де:
  • -u  username -- логін користувача, для якого встановлюємо квоти,
  • -b <block-softlimit> -- "м'який" ліміт по розміру,
  • -B <block-hardlimit> -- жорсткий ліміт по розміру,
  • -i <inode-softlimit> -- "м'який" ліміт кількості inode,
  • -I <inode-hardlimit> -- жорсткий ліміт кількості inode.
Одиниця виміру -- 1Кб блок. "Період терпимості" для "м'яких" лімітів по замовчуванню один тиждень. Керувати ним можна за допомогою "lfs setquota -t ...", детальніше див. "man lfs" та "32.1 User Utilities - lfs" (Lustre 2.0 Operations Manual).

Для груп все робиться аналогічно.

2. Отримання інформації про використання квот

Для поточного користувача:
[root@node ~]# lfs quota /lustre0
Disk quotas for user root (uid 0):
     Filesystem  kbytes   quota   limit   grace   files   quota   limit   grace
       /lustre0     344       0       0       -      25       0       0       -
Disk quotas for group root (gid 0):
     Filesystem  kbytes   quota   limit   grace   files   quota   limit   grace
       /lustre0     344       0       0       -      25       0       0       -

Для заданого користувача:
[root@node ~]# lfs quota -u username -v /lustre0
Disk quotas for user username (uid 518):
     Filesystem  kbytes   quota   limit   grace   files   quota   limit   grace
       /lustre0       0  209715200 262144000       -       0  2000000 2001000       -
lustre0-MDT0000_UUID
                      0       -  131072       -       0       -    5120       -
lustre0-OST0000_UUID
                      0       -  131072       -       -       -       -       -

Для отримання детальної інформації, в тому числі і по використанню OSS, використовується ключ "-v":
[root@node ~]# lfs quota -u username -v /lustre0
Disk quotas for user username (uid 518):
     Filesystem  kbytes   quota   limit   grace   files   quota   limit   grace
       /lustre0       0  209715200 262144000       -       0  2000000 2001000       -
lustre0-MDT0000_UUID
                      0       -  131072       -       0       -    5120       -
lustre0-OST0000_UUID
                      0       -  131072       -       - 

Для групи:
[root@node ~]# lfs quota -g users /lustre0

Надрукувати grace-limit:
[root@node ~]# lfs quota -t -u /lustre0
Block grace time: 1w; Inode grace time: 1w

Немає коментарів:

Дописати коментар