Эта серия выпусков из трех статей (см. раздел Ресурсы) посвящена дисковой подсистеме AIX® и подсистеме ввода/вывода. Третья статья серии сконцентрирована в основном на задачах оптимизации операций дискового ввода/вывода. Хотя настройка дисковой подсистемы является, пожалуй, менее захватывающей, чем настройка центрального процессора или настройка памяти, она является решающим компонентом в оптимизации производительности сервера. В действительности сделать для оптимизации операций дискового ввода/вывода можно гораздо больше, чем для оптимизации любого другого компонента системы, отчасти и потому, что дисковый ввод/вывод — самое слабое звено системы.
В первой и второй статьях этой серии обсуждалась важность архитектуры систем, влияние, которое она может оказать на общую системную производительность, а также новый инструмент настройки ввода/вывода lvmo, который может использоваться и для настройки логических томов. В этом выпуске можно узнать о настройке системы с помощью команды
ioo, которая регулирует большинство доступных параметров настройки ввода/вывода и отображает текущие или будущие загрузочные значения для всех параметров настройки ввода/вывода. Также рассказывается о том, как и когда нужно использовать инструментальные средства filemon и fileplace (эти специфические инструментальные средства AIX должны обязательно присутствовать в арсенале системного администратора), как улучшить общую производительность файловой системы, как настроить файловую систему. Приводится сравнение расширенной журналируемой файловой системы (JFS2) с журналируемой файловой системой (JFS) и даже рассматриваются некоторые атрибуты файловой системы, такие, как последовательный и произвольный доступ, которые могут повлиять на производительность.
В этом разделе обсуждается JFS2, производительность файловой системы и некоторые усовершенствования производительности по сравнению с JFS. Как известно, в AIX есть два типа ядер, 32-разрядные и 64-разрядные. Учитывая, что оба типа ядер совместно используют некоторые общие библиотеки и большинство команд и утилит, важно понять их различия, а также то, как ядра влияют на настройки общей производительности. JFS2 изначально была оптимизирована для 64-битовогоразрядного ядра, в то время как JFS оптимизирована для 32-разрядного. Журналируемые файловые системы, обеспечивая намного большую безопасность, исторически связаны с большим расходом производительности. В Центре Performance Rules для увеличения производительности на JFS (за счет снижения работоспособности) вам нужно было отключать регистрацию метаданных. Для JFS2 это невозможно и даже не нужно, потому что она настроена так, чтобы обрабатывать насыщенные метаданными типы приложений гораздо эффективнее. Что еще более важно, главное преимущество JFS2 состоит в ее способности к масштабированию. В JFS размер файла ограничен 64 ГБ. JFS2 поддерживает файлы размером 16 ТБ. Другое важное изменение — структура каталогов. Расширенная JFS2 использует двоичное представление дерева для поиска его узлов, что намного лучше, чем линейный метод, используемый в JFS. Далее, больше не нужно назначать узлы inode при создании файловой системы, поскольку они теперь динамически выделяются системой JFS2; это значит, что их количество неисчерпаемо. Несмотря на то, что параллельный ввод/вывод был описан в первом выпуске серии (см. раздел Ресурсы), здесь стоит повториться. Реализация параллельного ввода/вывода позволяет нескольким потокам читать и писать данные одновременно в один и тот же файл. Это происходит благодаря тому, что JFS2 разработана с использованием исключающих запись блокировок узлов inode. Это позволяет нескольким пользователям читать тот же самый файл одновременно, что резко увеличивает производительность во время чтения несколькими пользователями одного файла с данными. Чтобы включить параллельный ввод/вывод, вам просто нужно смонтировать файловую систему с соответствующими параметрами (Листинг 1). Рекомендуется рассмотреть возможность использования параллельного ввода/вывода при работе с базами данных, такими, как Oracle.
Листинг 1. Включение параллельного ввода/вывода
root@lpar29p682e_pub[/] mount -o cio /test
root@lpar29p682e_pub[/] > df -k /test
Filesystem 1024-blocks Free %Used Iused %Iused Mounted on
/dev/fslv00 131072 130724 1% 4 1% /test
|
Таблица 1 иллюстрирует различные расширения JFS2 и их влияние на производительность. Также важно понять, что при настройке ваших систем ввода/вывода многие из настраиваемых параметров изменяются (вы узнаете об этом позже) в зависимости от того, какую файловую систему вы используете — JFS или JFS2.
Таблица 1. Расширения JFS2
| Функция | JFS | JFS2 |
|---|---|---|
| Сжатие | Да | Нет |
| Квоты | Да | Да |
| Задержанное обновление | Да | No |
| Прямая поддержка ввода/вывода | Да | Да |
| Оптимизация | 32-бита | 64-бита |
| Максимальный размер файловой системы | 1 ТБ | 4 петабайта |
| Максимальный размер файла | 64 ГБ | 4 петабайта |
| Число узлов inode | Фиксировано при создании файловой системы | Динамическое |
| Поддержка больших файлов | Как опция монтирования | По умолчанию |
| Онлайн-дефрагментация | Да | Да |
| Namefs | Да | Да |
| DMAPI | Нет | Да |
В этом разделе мы представляем два важных инструментальных средства ввода/вывода — filemon и fileplace, и обсуждаем их применение для задач каждодневного системного администрирования.
Filemon использует функцию трассировки для создания отчета об активности ввода/вывода физических и логических устройств хранения, включая файлы, с которыми происходит текущая работа. Мониторинг активности ввода/вывода основан на интервале времени, который определяется при выполнении трассировки. Отчет сообщает обо всех уровнях использования файловой системы, включая Logical Volume Manager (LVM), виртуальную память и уровень физических дисков. При запуске без параметров команда выполняется в фоновом режиме, в то время как прикладные программы или системные команды выполняются и отслеживаются. Трассировка начинается автоматически, пока не будет остановлена. Тогда команда генерирует отчет об активности ввода/вывода и завершает работу. Команда может также обработать файл трассировки, который был записан инструментом трассировки. Отчёты затем делаются на основе информации из этого файла. Поскольку отчеты, выводимые на стандартный вывод, обычно быстро "пробегают" на экране, рекомендуется использовать опцию -o
, чтобы направить вывод в файл (Листинг 2).
Листинг 2. Использование filemon с опцией
-o
root@lpar29p682e_pub[/] > filemon -o dbmon.out -O all
Run trcstop command to signal end of trace.
Sun Aug 19 17:47:34 2007
System: AIX 5.3 Node: lpar29p682e_pub Machine: 00CED82E4C00
root@lpar29p682e_pub[/] > trcstop
[filemon: Reporting started]
root@lpar29p682e_pub[/] > [filemon: Reporting completed]
[filemon: 73.906 secs in measured interval]
root@lpar29p682e_pub[/] >
When we look at our file, here is what we see:
Sun Aug 19 17:50:45 2007
System: AIX 5.3 Node: lpar29p682e_pub Machine: 00CED82E4C00
Cpu utilization: 68.2%
Cpu allocation: 77.1%
130582780 events were lost. Reported data may have inconsistencies or errors.
Most Active Files
------------------------------------------------------------------------
#MBs #opns #rds #wrs file volume:inode
------------------------------------------------------------------------
0.3 1 70 0 unix /dev/hd2:38608
0.0 9 11 0 vfs /dev/hd4:949
0.0 2 4 0 ksh.cat /dev/hd2:58491
Most Active Segments
------------------------------------------------------------------------
#MBs #rpgs #wpgs segid segtype volume:inode
------------------------------------------------------------------------
0.6 0 162 223b9 client
Most Active Logical Volumes
------------------------------------------------------------------------
util #rblk #wblk KB/s volume description
------------------------------------------------------------------------
0.25 0 120 0.2 /dev/hd8 jfs2log
0.00 0 1304 2.7 /dev/hd4 /
------------------------------------------------------------------------
Detailed File Stats
------------------------------------------------------------------------
FILE: /unix volume: /dev/hd2 inode: 38608
opens: 1
total bytes xfrd: 286720
reads: 70 (0 errs)
read sizes (bytes): avg 4096.0 min 4096 max 4096 sdev 0.0
read times (msec): avg 0.003 min 0.002 max 0.005 sdev 0.001
lseeks: 130
------------------------------------------------------------------------
Detailed VM Segment Stats (4096 byte pages)
------------------------------------------------------------------------
SEGMENT: 223b9 segtype: client
segment flags: clnt
writes: 162 (0 errs)
write times (msec): avg 1.317 min 0.369 max 1.488 sdev 0.219
write sequences: 5
write seq. lengths: avg 32.4 min 1 max 64 sdev 20.8
------------------------------------------------------------------------
Detailed Logical Volume Stats (512 byte blocks)
------------------------------------------------------------------------
VOLUME: /dev/hd8 description: jfs2log
writes: 15 (0 errs)
write sizes (blks): avg 8.0 min 8 max 8 sdev 0.0
write times (msec): avg 0.389 min 0.287 max 1.277 sdev 0.250
write sequences: 11
write seq. lengths: avg 10.9 min 8 max 24 sdev 5.1
seeks: 11 (73.3%)
Detailed Physical Volume Stats (512 byte blocks)
------------------------------------------------------------------------
VOLUME: /dev/hdisk0 description: Virtual SCSI Disk Drive
writes: 33 (0 errs)
write sizes (blks): avg 45.3 min 8 max 256 sdev 82.7
write times (msec): avg 0.544 min 0.267 max 1.378 sdev 0.370
write sequences: 26
write seq. lengths: avg 57.5 min 8 max 512 sdev 122.6
seeks: 26 (78.8%)
seek dist (blks): init 17091584,
avg 913560.3 min 8 max 3940256 sdev 1431025.7
seek dist (%tot blks):init 40.74951,
avg 2.17810 min 0.00002 max 9.39430 sdev 3.41183
time to next req(msec): avg 6369.624 min 0.051 max 120046.794 sdev 23589.450
throughput: 3.1 KB/sec
utilization: 0.00
|
В выводе обращайте внимание на задержку позиционирования головок диска, поскольку она может привести к уменьшению производительности приложений. Анализируя число операций последовательного чтения и записи, можно определить, последователен доступ или выборочен. Эта информация поможет провести настройку операций ввода/вывода. Данный вывод ясно демонстрирует отсутствие каких бы то ни было "пробуксовок" ввода/вывода, о которых стоило бы говорить. Filemon выдаёт огромное количество информации и, правду говоря, её иногда даже слишком много. Далее могут обнаружиться сильные всплески производительности во время использования filemon. Давайте посмотрим на результаты топаза (topaz) во время работы filemon (рисунок 1).
Рисунок 1. Результаты топаза во время запуска filemon
В этом примере filemon занимает почти 96% времени центрального процессора! Как правило, трудно рекомендовать инструменты производительности, у которых есть такие существенные издержки. Еще раз повторим: хотя filemon, несомненно, является полезным инструментом, использовать его необходимо очень осторожно.
А как насчет fileplace? Fileplace выдаёт отчет о размещении файловых блоков в пределах файловой системы. Обычно его используют для исследования и оценки эффективности размещения файла на диске. Для каких целей вы можете его использовать? Одна из возможных задач — определить, насколько существенно фрагментированы некоторые из часто используемых файлов. Также можно определить физический том с наиболее высоким процентом использования, и является ли диск или адаптер ввода/вывода "узким местом" производительности.
Давайте рассмотрим пример очень часто используемого файла ( Листинг 3.
Листинг 3. Часто используемый файл
root@lpar29p682e_pub[/] > fileplace -pv dbfile
File: dbfile Size: 5374622 bytes Vol: /dev/hd4
Blk Size: 4096 Frag Size: 4096 Nfrags: 1313
Inode: 21 Mode: -rw-r--r-- Owner: root Group: system
Physical Addresses (mirror copy 1) Logical Extent
---------------------------------- ----------------
02134816-02134943 hdisk0 128 frags 524288 Bytes, 9.7% 00004352-00004479
02135680-02136864 hdisk0 1185 frags 4853760 Bytes, 90.3% 00005216-00006400
1313 frags over space of 2049 frags: space efficiency = 64.1%
2 extents out of 1313 possible: sequentiality = 99.9%
|
В этом случае вы должны быть заинтересованы в эффективном использовании пространства и последовательном доступе. Более высокая эффективность использования пространства означает меньшую фрагментацию и возможность последовательного доступа к файлам. Более высокая степень последовательности говорит о том, что файлы распределены более компактно, что также хорошо для последовательного доступа к файлу. В приведённом выше случае использование пространства может быть и лучше, а последовательность размещения весьма высока. Если пространственная эффективность и последовательность доступа слишком низки, то стоит рассмотреть возможность реорганизации файловой системы. Это можно сделать с помощью команды reorgvg, которая может улучшить эффективность использования логического тома.
Настройка с использованием ioo
В этом разделе обсуждается применение утилиты ioo, которая используется для настройки фактически всех параметров, связанных с вводом/выводом.
Как и с vmo, необходимо быть чрезвычайно осторожным при изменении параметров ioo, так как изменяемые на лету параметры могут вызвать серьезное снижение производительности. В Таблице 2
показаны некоторые параметры настройки, которые часто используются для файловой системы JFS. Как вы можете ясно видеть, большинство команд настройки для ввода/вывода используют утилиту
ioo.
Таблица 2. Параметры настройки
| Функция | Параметр настройки JFS | Параметр настройки расширенной JFS |
|---|---|---|
| Максимальный объем памяти для кэширования файлов |
vmo -o maxperm=value
|
vmo -o maxclient=value (< or =
maxperm) |
| Минимальный объем памяти для кэширования |
vmo -o minperm=value
| n/a |
| Установка жесткого ограничения памяти для кэширования |
vmo -o strict_maxperm
|
vmo -o maxclient (hard limit) |
| Максимальное число страниц, используемых для упреждающего последовательного чтения |
ioo -o maxpgahead=value
|
ioo -o j2_maxPageReadAhead=value
|
| Минимальное число страниц, используемых для упреждающего последовательного чтения |
ioo -o minpgahead
|
ioo -o j2_minPageReadAhead=value
|
| Устанавливает максимальное число отложенных записей, ввода/вывода в файл |
chhdev -l sys0 -a maxpout maxpout
|
chdev -l sys0 -a maxpout maxpout
|
| Устанавливает минимальное число отложенных записей, ввода/вывода в файл, при котором могли бы продолжать выполнение программы, блокированные maxpout |
chdev -l sys0 -a minpout minpout
|
chdev -l sys0 -a minpout minpout
|
| Устанавливает размер кэша измененных данных для файла с произвольными записями |
ioo -o maxrandwrt=value
|
ioo -o j2_maxRandomWrite ioo -o j2_nRandomCluster
|
| Управляет группировкой операций ввода/вывода для последовательной отложенной записи |
ioo -o numclust=value
|
ioo -o j2_nPagesPerWriteBehindCluster=value
|
| Устанавливает число буферов (bufstructs) файловой системы |
ioo -o numfsbufs=value
|
ioo -o j2_nBufferPerPagerDevice=value
|
Давайте далее обсудим некоторые из наиболее важных параметров, приведённых ниже, поскольку все параметры настройки vmo уже обсуждались в выпусках по настройке памяти (см. раздел Ресурсы).
Есть несколько способов, с помощью которых можно определить текущие значения
ioo системе. Длинный вывод команды
ioo даёт много информации (
Листинг 4). В выводе перечисляются текущее значение, значение перезагрузки, значения диапазона, модуля, типа, и зависимостей всех настраиваемых параметров, которыми управляет
ioo.
Листинг 4. Вывод ioo
root@lpar29p682e_pub[/] > ioo -L
NAME CUR DEF BOOT MIN MAX UNIT TYPE
DEPENDENCIES
j2_atimeUpdateSymlink 0 0 0 0 1 boolean D
j2_dynamicBufferPreallo 16 16 16 0 256 16K slabs D
j2_inodeCacheSize 400 400 400 1 1000 D
j2_maxPageReadAhead 128 128 128 0 64K 4KB pages D
j2_maxRandomWrite 0 0 0 0 64K 4KB pages D
j2_maxUsableMaxTransfer 512 512 512 1 4K pages M
j2_metadataCacheSize 400 400 400 1 1000 D
j2_minPageReadAhead 2 2 2 0 64K 4KB pages D
j2_nBufferPerPagerDevice 512 512 512 512 256K M
j2_nPagesPerWriteBehindC 32 32 32 0 64K D
j2_nRandomCluster 0 0 0 0 64K 16KB clusters D
j2_nonFatalCrashesSystem 0 0 0 0 1 boolean D
j2_syncModifiedMapped 1 1 1 0 1 boolean D
j2_syncdLogSyncInterval 1 1 1 0 4K iterations D
jfs_clread_enabled 0 0 0 0 1 boolean D
jfs_use_read_lock 1 1 1 0 1 boolean D
lvm_bufcnt 9 9 9 1 64 128KB/buffer D
maxpgahead minpgahead 8 8 8 0 4K 4KB pages D
maxrandwrt 0 0 0 0 512K 4KB pages D
memory_frames 512K 512K 4KB pages S
Minpgahead maxpgahead 2 2 2 0 4K 4KB pages D
numclust 1 1 1 0 2G-1 16KB/cluster D
numfsbufs 196 196 196 1 2G-1 M
pd_npages 64K 64K 64K 1 512K 4KB pages D
pgahd_scale_thresh 0 0 0 0 419430 4KB pages D
pv_min_pbuf 512 512 512 512 2G-1 D
sync_release_ilock 0 0 0 0 1 boolean D
n/a means parameter not supported by the current platform or kernel
Parameter types:
S = Static: cannot be changed
D = Dynamic: can be freely changed
B = Bosboot: can only be changed using bosboot and reboot
R = Reboot: can only be changed during reboot
C = Connect: changes are only effective for future socket connections
M = Mount: changes are only effective for future mountings
I = Incremental: can only be incremented
d = deprecated: deprecated and cannot be changed
|
Листинг 5 показывает, как изменить настраиваемый параметр.
Листинг 5. Изменение настраиваемого параметра
root@lpar29p682e_pub[/] > ioo -o maxpgahead=32
Setting maxpgahead to 32
root@lpar29p682e_pub[/] >
|
Этот параметр используется только для JFS. Информация, приведенная в следующем разделе, относится к JFS2.
Некоторые важные улучшения производительности файловой системы для JFS2 включают в себя упреждающее последовательное чтение страницы, а также как последовательную, так и произвольную отложенные записи. Диспетчер Virtual Memory Manager (VMM) AIX упреждает запросы страниц, отслеживая шаблоны файлов, к которым осуществляется доступ. Когда программа обращается к двум страницам файла, VMM предполагает, что программа будет пытаться получить доступ к файлу в последовательном режиме. Число страниц для упреждающего чтения может быть настроено с помощью порогов VMM. Обратите внимание на эти два важных параметра для JFS2:
-
J2_minPageReadAhead: этот параметр определяет число страниц упреждения, когда VMM первоначально обнаруживает последовательный шаблон; -
J2_maxPageReadAhead: этот параметр определяет максимальное количество страниц, которые VMM может читать в последовательном файле.
Последовательная и случайная отложенные записи имеют отношение к записи измененных страниц из памяти на диск после достижения определенного порога. Таким образом, не нужно ожидать
syncd для того, чтобы сбросить страницы на диск. Это делается в целях ограничения количества "грязных страниц" (dirty pages) в памяти, что в итоге уменьшает непроизводительные издержки ввода/вывода и дисковую фрагментацию.
Два типа отложенной записи — это последовательный и произвольный. При последовательной отложенной записи, во время выполнения демона
syncd, страницы не остаются в памяти, что может вызвать возникновение "пробуксовок". При произвольной обратной записи число страниц в памяти превышает установленное количество, и все следующие страницы записываются на диск.
Другая важная область, заслуживающая внимания — большие объёмы обработки последовательного ввода/вывода. В случае слишком большого количества одновременных доступов ввода/вывода к файловым системам, ввод/вывод может "пробуксовывать" на уровне файловой системы. В этом случае нужно увеличить параметр j2_nBufferPerPagerDevice
(numfsbus -- для системы JFS). Если Вы используете "сырой" ввод/вывод вместо файловой системы, то таким же образом "забуксовать" может LVM. В этом случае настраивается параметр lvm_bufcnt.
Эта статья посвящена производительности файловой системы. Сначала мы узнали о расширении функциональных возможностей в JFS2 и почему её нужно предпочесть в качестве файловой системы. Далее мы использовали инструментальные средства, такие, как filemon и fileplace, для сбора более подробной информации о фактических структурах файла и узнали, как они влияют на производительность ввода/вывода. Наконец, мы настроили нашу подсистему ввода/вывода, используя команду ioo, и узнали о параметрах J2_minPageReadAhead и
J2_maxPageReadAhead, которые увеличивают производительность в условиях последовательного ввода/вывода.
Из трех частей этой серии о вводе/выводе вы узнали, что настройка, запущенная до начала стресс-теста вашей системы, имеет для этого компонента системы, возможно, большее значение, чем для любого другого компонента. Правильная архитектура может сделать больше для увеличения производительности, чем какие-либо дополнительные настройки параметров ввода/вывода. Тут подразумевается и стратегическое размещение дисков, и достаточное количество адаптеров для поддержания пропускной способности ваших дисков. Далее, хотя эта серия статей посвящена вводу/выводу, важно понимать, что менеджер виртуальной памяти Virtual Memory Manager (VMM) также очень тесно связан с производительностью ввода/вывода, и также должен быть настроен для получения оптимальной производительности ввода/вывода.
- Оригинал статьи
Optimizing AIX 5L performance: Tuning disk performance, Part 3 (EN).
- "Управление хранением данных в AIX 5.3 "
(Шив Дутта, Shiv Dutta), developerWorks, апрель 2005): эта статья посвящена некоторым возможностям, реализованным в AIX 5L версии 5.3 для расширения возможностей, функциональности и производительности менеджера логических томов (LVM) и расширенной журналируемой файловой системы (JFS2). (EN)
- "Привязка задачи к процессору на AIX"
(developerWorks, ноябрь 2006): применение привязки задач к процессору для привязки и отмены привязки потоков может помочь в поиске причин зависания системы или взаимоблокировки. Прочитайте статью для того чтобы узнать, как использовать привязку задач к процессору для запрещения процесса и запуска его только на указанном центральном процессорном устройстве (CPU).(EN)
- "Контроль и настройка ЦП"
(март 2002): узнайте, как с помощью стандартного инструментария AIX определить "узкие места" ЦП.
-
IBM
Redbooks:
AIX 5L Practical Performance Tools and Tuning Guide — это исчерпывающее руководство об инструментах контроля и настройки производительности, имеющихся в составе AIX 5L версии 5.3.
- "Что может предложить вам AIX 5L версии 5.3?"
( Шив Дутта, Shiv Dutta), developerWorks, июнь 2005): узнайте, какими преимуществами AIX 5L версии 5.3. вы можете воспользоваться. (EN)
-
IBM Redbooks:
Руководство по отличиям в AIX 5L версии 5.3 рассказывает об отличительных особенностях AIX 5L версии 5.3 по сравнению с AIX 5L версии 5.2.(EN)
-
Операционная система и управление аппаратными компонентами:
этот документ предоставляет пользователям и системным администраторам исчерпывающую информацию, которая может помочь при выборе опций во время выполнения таких задач, как резервное копирование и восстановление системы, управление физическими и логическими носителями и определение необходимого размера пространства постраничной подкачки.(EN)
-
IBM Redbooks:
для сдачи экзаменов на получение сертификата IBM для AIX 5L и eServer® pSeries® прочитайте Руководство по сертификации для администрирования eServer p5 и pSeries и поддержки AIX 5L версии 5.3..(EN)
-
Popular content:
посмотрите, что интересного находят для себя в AIX и UNIX ваши коллеги.(EN)
-
AIX and
UNIX:
раздел по AIX и UNIX от developerWorks предоставляет огромное количество информации по всем аспектам администрирования систем AIX и по расширению ваших навыков в UNIX.
- Получайте свежую информацию из раздела
Webвеб-трансляций и технических мероприятий developerWorks. (EN)
-
Podcasts: настройтесь и идите в ногу с техническими экспертами IBM.
-
Future Tech:
посетите сайт Технологий будущего, чтобы узнать о новейших достижениях.(EN)
Кен Милберг занимает должности Technical Writer и Site Expert на сайте techtarget.com и предоставляет техническую информацию и поддержку по Linux на searchopensource.com. Он также является автором и техническим редактором IBM Systems Magazine, Open Edition. Кен обладает степенью бакалавра компьютерных и информационных наук и степенью магистра по менеджменту технологий Университета штата Мэрилэнд. Он является основателем и лидером группы пользователей POWER-AIX Лонг-Айленда. В течение многих лет он работал как в крупных, так и небольших организациях и занимал различные должности от директора по информационным технологиям до главного разработчика AIX. Сейчас он работает в Future Tech, бизнес-партнере IBM в Лонг-Айленде. Кен обладает званиями PMI certified Project Management Professional (PMP), IBM Certified Advanced Technical Expert (CATE, IBM System p5 2006), и Solaris Certified Network Administrator (SCNA). Вы можете связаться с ним по адресу kmilberg@gmail.com.