performance – Ivan Pesin https://pesin.space/blog Articles & Translations Wed, 19 Oct 2016 02:08:18 +0000 en-US hourly 1 https://wordpress.org/?v=5.1.1 Multitasking in System Administration /blog/2015/12/multitasking-in-system-administration/?utm_source=rss&utm_medium=rss&utm_campaign=multitasking-in-system-administration Tue, 29 Dec 2015 17:00:07 +0000 https://pesin.space/blog/2015/12/multitasking-in-system-administration/ Just a quick thought on multitasking in SA (or DevOps, if you prefer). There is a common knowledge that multitasking is bad, it hurts your performance, quality, and whatnot.

Here is a nice chart to illustrate the idea:

context-swtiching

Obviously, the above is more of a rule of thumb and here is a nice summarisation. However, there was another study on the matter by Harward’s professors S.Wheelwright and K.Clark that draw slightly different picture:

6a00d8341c500653ef014e606c9737970c

What’s important here is that the percent of time on tasks or performance actually maximises at 2 concurrent tasks. This is actually much more in line with my personal observations. You can also argue that in the field of SA we often have tasks that require significant amount of “wait time” when you kick something off and then simply wait for it to complete, so the latter graph has even more sense.

]]>
Как создать файловую систему ext3, оптимизированную для работы на RAID и приложений с прямым вводом/выводом? /blog/2009/06/%d0%ba%d0%b0%d0%ba-%d1%81%d0%be%d0%b7%d0%b4%d0%b0%d1%82%d1%8c-%d1%84%d0%b0%d0%b9%d0%bb%d0%be%d0%b2%d1%83%d1%8e-%d1%81%d0%b8%d1%81%d1%82%d0%b5%d0%bc%d1%83-ext3-%d0%be%d0%bf%d1%82%d0%b8%d0%bc%d0%b8/?utm_source=rss&utm_medium=rss&utm_campaign=%25d0%25ba%25d0%25b0%25d0%25ba-%25d1%2581%25d0%25be%25d0%25b7%25d0%25b4%25d0%25b0%25d1%2582%25d1%258c-%25d1%2584%25d0%25b0%25d0%25b9%25d0%25bb%25d0%25be%25d0%25b2%25d1%2583%25d1%258e-%25d1%2581%25d0%25b8%25d1%2581%25d1%2582%25d0%25b5%25d0%25bc%25d1%2583-ext3-%25d0%25be%25d0%25bf%25d1%2582%25d0%25b8%25d0%25bc%25d0%25b8 Sun, 28 Jun 2009 07:56:50 +0000 http://www.n-ix.com/ipesin/?p=257

Система: Red Hat Enterprise Linux 3, Red Hat Enterprise Linux 4, Red Hat Enterprise Linux 5

Решение:

RAID уровней 0, 4, 5 и 6 для записи на разные диски, разбивает данные на большие блоки — “полосы”, обычно по 64KB. Выравнивание разделов и файловых систем в соответствии с размером этих полос может повысить производительность, в частности, программ, которые используют прямой ввод/вывод.

Программа fdisk создаёт разделы, выровненные по границам цилиндров, в соответствии с исторической геометрией “цилиндр/дорожка/сектор” (cylinder/head/sector, C/H/S). Это позволяет обеспечить максимальную совместимость с другими операционными системами и утилитами. К сожалению, такая геометрия обычно не соответствует размеру полосы RAID-массива. Если доступ к RAID будет осуществляться только операционными системами и утилитами, полностью поддерживающими логическую адресацию блоков (Logical Block Addressing, LBA), то необходимость в выравнивании по геометрии C/H/S отпадает, а с помощью программы parted можно выровнять разделы под полосы RAID-массива.

Внимание: все приводимые здесь примеры уничтожают существующие разделы и файловые системы. Применяйте их только для создания новых файловых систем.

Пример 1: выровненный по границе цилиндра раздел, созданный утилитой fdisk на диске /dev/sdb.

[root@localhost ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.

The number of cylinders for this disk is set to 60799.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-60799, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-60799, default 60799):
Using default value 60799

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# parted -s /dev/sdb unit s print

Model: APPLE Xserve RAID (scsi)
Disk /dev/sdb: 976748543s
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start    End         Size        Type     File system  Flags
 1      63s      976735934s  976735872s  primary

[root@localhost ~]#

Parted показывает, что fdisk создал раздел, начиная с 63-сектора (32,256 байта) тома, что совместимо с геометрией C/H/S, но не оптимально для RAID. Поскольку RAID использует полосы размером 64KB, начало раздела должно быть сдвинуто на сектор 128. Начинать раздел с нулевого сектора нельзя, поскольку будет перезаписана таблица разделов. Большинство RAID-массивов используют сектора размером 512 байт, но возможны сектора и большего размера.

Примечание: По-умолчанию, parted использует в единицах размера легко читаемые сокращения системы СИ (степени числа 10). Поскольку они редко совпадают со степенями числа 2, parted нужно перевести в режим работы с секторами (unit s), перед тем как проверять или задавать выравнивание разделов по секторам.

Пример 2: удалите раздел /dev/sdb1 и создайте его заново, начиная с сектора 128.

[root@localhost ~]# parted /dev/sdb
GNU Parted 1.8.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit s
(parted) print

Model: APPLE Xserve RAID (scsi)
Disk /dev/sdb: 976748543s
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start    End         Size        Type     File system  Flags
 1      63s      976735934s  976735872s  primary

(parted) rm 1
(parted) mkpart primary 128 976735934
(parted) print

Model: APPLE Xserve RAID (scsi)
Disk /dev/sdb: 976748543s
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start    End         Size        Type     File system  Flags
 1     128s      976735934s  976735807s  primary

(parted) quit
[root@localhost ~]#

Примечание: Команды move и resize утилиты parted пытаются сохранить содержимое файловой системы раздела. Если в разделе нет файловой системы, то эти команды откажутся работать.

Выровненная файловая система ext3 может быть создана на выровненном разделе или на логическом томе, состоящем из выровненных физических томов. LVM не влияет на выравнивание, если размер физического экстента, превосходит размер блока RAID. Обычно размер RAID блока равен 64KB, а размер физического экстента — 4MB.

Команда mke2fs принимает параметр stride, который позволяет оптимизировать размещение метаданных файловой системы для RAID-массивов. Параметр задаётся в блоках файловой системы, которые в большинстве случаев равняются 4KB. Чтобы избежать возможных неточностей и гарантировать правильность вычислений, лучше всего его задать явно.

Пример 3: создайте файловую систему ext3 на /dev/sdb1, оптимизированную для RAID с размером блока 64KB.

[root@localhost ~]# mke2fs -j -b 4096 -E stride=16 /dev/sdb1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
61046784 inodes, 122091975 blocks
6104598 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
3726 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@localhost ~]#

]]>
Как определить и настроить вероятность с которой процесс будет завершён при нехватке оперативной памяти /blog/2009/06/%d0%ba%d0%b0%d0%ba-%d0%be%d0%bf%d1%80%d0%b5%d0%b4%d0%b5%d0%bb%d0%b8%d1%82%d1%8c-%d0%b8-%d0%bd%d0%b0%d1%81%d1%82%d1%80%d0%be%d0%b8%d1%82%d1%8c-%d0%b2%d0%b5%d1%80%d0%be%d1%8f%d1%82%d0%bd%d0%be%d1%81/?utm_source=rss&utm_medium=rss&utm_campaign=%25d0%25ba%25d0%25b0%25d0%25ba-%25d0%25be%25d0%25bf%25d1%2580%25d0%25b5%25d0%25b4%25d0%25b5%25d0%25bb%25d0%25b8%25d1%2582%25d1%258c-%25d0%25b8-%25d0%25bd%25d0%25b0%25d1%2581%25d1%2582%25d1%2580%25d0%25be%25d0%25b8%25d1%2582%25d1%258c-%25d0%25b2%25d0%25b5%25d1%2580%25d0%25be%25d1%258f%25d1%2582%25d0%25bd%25d0%25be%25d1%2581 Thu, 25 Jun 2009 12:24:59 +0000 http://www.n-ix.com/ipesin/?p=256

Ядро Red Hat Enterprise Linux 5.2 создает 2 файла для каждого процесса, которые позволяют управлять вероятностью, с которой этот процесс будет завершён, когда система будет вынуждена заврешать процессы из-за нехватки оперативной памяти (out-of-memory, OOM). Это файлы:

  • /proc/[pid]/oom_adj — используется для изменения “OOM-счёта” (OOM score), который определяет вероятность завершения процесса при нехватке оперативной памяти. Чем больше значение OOM-счёта, тем больше вероятность того, что процесс будет завершён подсистемой oomkill. Допустимые значения находятся в промежутке от -17 до 15; обратите внимание, что OOM-счёт равный -17 означает, что [pid] не будет завершён при нехватке памяти.

    Чтобы задать OOM-счёт, просто выполните команду echo значение с выводом в файл /proc/[pid]/oom_adj. Например, чтобы установить OOM-счёт равный 15 для процесса 1111, выполните:

    echo 15 > /proc/1111/oom_adj

    Учтите, что OOM-счёт наследуется процессом-потомком от родительского процесса при использовании системных вызовов семейства fork().

  • /proc/[pid]/oom_score — содержит текущий OOM-счёт для данного процесса. Используйте команду cat чтобы посмотреть текущий OOM-счёт для процесса с номером [pid]. Например, чтобы узнать текущий OOM-счёт для процесса 1111, выполните:

    cat /proc/1111/oom_score

Прим. пер.: Значение в файле oom_score — динамически вычисляемое, оно не равняется значению, которое передаётся в файл oom_adj. Значение, передаваемое в файл oom_adj, меняет вероятность в большую или меньшую сторону, а не задаёт абсолютное значение.

]]>
Как увеличить приоритет операций ввода-вывода некоторых процессов в Red Hat Enterprise Linux 5? /blog/2009/05/%d0%ba%d0%b0%d0%ba-%d1%83%d0%b2%d0%b5%d0%bb%d0%b8%d1%87%d0%b8%d1%82%d1%8c-%d0%bf%d1%80%d0%b8%d0%be%d1%80%d0%b8%d1%82%d0%b5%d1%82-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b9-%d0%b2%d0%b2%d0%be/?utm_source=rss&utm_medium=rss&utm_campaign=%25d0%25ba%25d0%25b0%25d0%25ba-%25d1%2583%25d0%25b2%25d0%25b5%25d0%25bb%25d0%25b8%25d1%2587%25d0%25b8%25d1%2582%25d1%258c-%25d0%25bf%25d1%2580%25d0%25b8%25d0%25be%25d1%2580%25d0%25b8%25d1%2582%25d0%25b5%25d1%2582-%25d0%25be%25d0%25bf%25d0%25b5%25d1%2580%25d0%25b0%25d1%2586%25d0%25b8%25d0%25b9-%25d0%25b2%25d0%25b2%25d0%25be Sat, 30 May 2009 09:12:06 +0000 http://www.n-ix.com/ipesin/?p=85

Система: Red Hat Enterprise Linux 5 и новее

Введение:
Приоритет и класс ввода/вывода процесса могут быть изменены командой ionice. Linux поддерживает три класса ввода/вывода:

  • Idle: процесс, имеющий класс idle, получает возможность работать с диском только если никакая другая программа не выполняет операций ввода/вывода в течении некоторого периода времени.
  • Best effort: этот класс используется всеми процессами по-умолчанию, если не был задан определённый класс ввода/вывода.
  • Real time: процессы, работающие в классе реального времени, получают доступ к диску в перую очередь, вне зависимости от того, что еще происходит в системе.

По-умолчанию, процессы работают в классе Best Effort с приоритетом равным нулю, т.е. с наивысшим приоритетом в этом классе. Наилучший вариант применения ionice — улучшение производительности в случаях, когда нужно одновременно выполнять два класса задач: такие, которые не требуют много ввода/вывода, но чувствительны к скорости выполнения операций, и такие, которые наоборот нетребовательны к скорости отклика, но выполняют много операций ввода/вывода.

Решение:
Для повышения приоритета ввода/вывода процесса используйте следующую команду:

# ionice -c1 -n0 -p<PID>

Где:

  • -c1 указывает класс реального времени
  • -n0 задаёт наивысший приоритет
  • -p <PID> указывает идентификатор процесса

Понизить приоритет ввода/вывода процесса можно командой:

# ionice -c2 -n4 -p<PID>

Где:

  • -c2 указывает класс best-effort
  • -n4 задаёт приоритет 4

Чтобы узнать текущий приоритет ввода/вывода процесса, выполните команду:

# ionice <PID>

Например:

# ionice 9709
realtime: prio 7

За подробной информацией о ключах команды ionice, обращайтесь к руководству, которое доступно по команде man ionice.

Применения
Если текущему командному интерпретатору задать класс idle, то все команды, которые из него вызываются, будут тоже выполняться в классе idle. Чтобы это сделать, нам понадобится переменная $$ интерпретаторов bash и sh.

Например:

# echo $$
29033

Этот вывод означает, что PID вашего текущего интерпретатора равен 29033. Если вы хотите назначить назначить ему класс idle, выполните команду:

# ionice -c3 -p$$

Теперь всё, что вы делаете в этом интерпретаторе, выполняется в классе idle.

Другим специальным применением ionice является приоритезация системных бекапов. Вы можете изменить приоритет ввода/вывода архивирующего программного обеспечения так, чтобы оно не мешало другим приложениям в системе.

Примечание: приоритеты и классы ввода/вывода поддерживаются начиная с версии ядра 2.6.13, при использовании планировщика ввода/вывода CFQ. В Red Hat Enterprise Linux 5 для того, чтобы узнать какой планировщик используется в данный момент, используйте команду cat /sys/block/[sh]d[a-z]*/queue/scheduler. Текущий планировщик будет выделен квадратными скобками..

Например, следующий вывод показывает, что сейчас используется планировщик CFQ:

$ cat /sys/block/[sh]d[a-z]*/queue/scheduler
noop anticipatory deadline [cfq]

]]>