/vvk2016-09-18T17:05:51ZVladimir Kamarzincyrax/2016/09/19/beeline/Про корпоративную SIP-телефонию от Билайн2016-09-19T00:00:00Z2016-09-19T00:00:00Z
<p>Всё началось с того, что очередной конкурс на связь для нашей горячей линии 8-800 выиграл Билайн.
Первое время услуга предоставлялась просто перенаправлением номера 8-800 на один из наших внешних
номеров, которые мы получаем от другого оператора. А по условиям контракта у нас прописана подача
услуги либо по SIP через выделенный канал, либо перенаправлением на один из наших номеров.</p>
<p>И вот в какой-то момент Билайн решил, что "хватит нам подавать услугу редиректом, давай-ка мы
проведём абоненту оптику и подадим по SIP". В общем, оптику нам успешно завели, поставили
медиаконвертер (причём нифига не рэковый, и без полки - пришлось его приспосабливать в стойке).
Через недельку примерно настроили канал, подняли SIP-транк от нашего asterisk до их сервера,
убедились в работоспособности телефонии. Переключили 8-800 на этот транк. <strong>Всё успешно работало целых
2 (джва!) дня.</strong></p>
<p>Через 2 дня оказалось, что на asterisk отваливается регистрация на SIP-сервере билайна. Оно и не
удивительно, т.к. в это время с нашего SIP-сервера не было пинга до SIP-сервера билайна.
Естественно, сразу создали заявку в техподдержку билайна, до выяснения ситуации переключили 8-800 на
старую схему.</p>
<p><strong>Что интересно, в процессе разбирательств выяснилось, что если с нашего SIP-сервера пингануть любой
IP-шник в подсети билайна (за исключением IP SIP-сервера), то связь с SIP билайн магически
восстанавливается</strong> - пинги проходят, asterisk регается. Это всё работает пол-часа, потом связь
пропадает опять.</p>
<p>Расскажу немного о сетевой конфигурации.
С медиаконвертера билайна патч-корд идёт в наш коммутатор в порт, который настроен в режиме access,
и принадлежит 21-му vlan. Далее этот 21-й vlan попадает на сервер с телефонией (уже в tagged) и далее
в openvz-контейнер с asterisk. В этом контейнере таким образом 2 интерфейса - один для связи с
миром, и второй - чисто для доступа в сеть Билайн.</p>
<p>Примерная адресация, чтобы было понятно:</p>
<ul>
<li>192.168.1.1 - билайн gateway</li>
<li>192.168.1.2 - SIP-сервер билайна</li>
<li>192.168.1.100 - наш SIP-сервер</li>
<li>255.255.255.0 - маска</li>
</ul>
<p>Итак, в билайн была создана заявка, они сообщили, что будут проводить проверки у себя на сети. В
общем, перезванивались туда-сюда недели 2, несколько раз билайн тестировал свою сеть, не находил
никаких проблем и отвечал в духе "да это у вас там локальная проблема, чините своё оборудование".
Что-либо доказать было практически невозможно. В общем, я успел уйти в отпуск и выйти из него, а
проблема как была так и осталась.</p>
<p>Расскажу, как типично строилось общение с техподдержкой. Этого дела по полной хлебнул мой коллега
Игорь, пока я был в отпуске. Звонок в техподдержку, висим на линии минут
от 10 до 60, попадаем на вежливого сотрудника 1-й линии, который в технической части не понимает
ничего, может лишь создать/закрыть заявку, добавить коммент. После объяснения, кто мы такие,
называния номера заявки как правило следует перевод на другого специалиста, уже технического. Только
вот шанс того, что он возьмёт трубку, вовсе не 100%. Да-да, можно провисеть час на линии и так и не
попасть на спеца.</p>
<p>А теперь про квалификацию сетевых специалистов 2-й линии. Сказать, что она слабовата, ничего не
сказать. <strong>У "спецов" из билайна проблемы с базовым пониманием работы IP-сетей.</strong> Попал я значит на
такого специалиста, описал ему проблему и вот этот интересный трюк с пингом, после которого всё
внезапно начинает работать. Само по себе это его не заинтересовало, зато он захотел проверить наши
настройки. Наш IP такой-то? Маска такая-то? Адрес SIP-сервера такой-то? Гейтвей у вас прописан
такой-то? Вот тут я и говорю - гейтвей у нас тут вообще не указан, т.к. в вашей сети нас интересует
только SIP-сервер, а на гейтвей мы никакие пакеты не шлём, т.к. все остальные сети кроме
билайновской у нас завёрнуты на наш роутер. Вот тут-то билайновский "спец" не на шутку раздухарился.
Да как же так, да вы что, как это так вы не прописали наш гейтвей, из-за этого конечно всё и не
работает! Попытался объяснить ему, что для взаимодействия хостов в одной сети, в одном сегменте,
никакой гейтвей нахер не нужон, т.к. от нас ушёл arp-запрос, от нужного хоста пришёл ответ, IP-пакет
уехал куда надо, на гейтвей всё равно никакие пакеты не шлются. Хрен-то там, товарищ-то не въезжает
как вообще сеть работает - продолжает настаивать, что гейтвей просто необходим для такого
взаимодействия! Слашать ничего не хочет, тем более поработать мозгом и слегка разобраться в
проблеме.</p>
<p>Ну хер с вами, будет вам гейтвей. Берём ноут с linux-ом, напрямую цепляем его в медиаконвертер,
настраиваем интерфейс как надо, с гейтвеем. Что бы вы думали? Естественно проблема воспроизводится
тут как тут. Пол-часа работает - потом всё, пинги пропадают.</p>
<p>После этого связался с менеджером, который нас курирует, объяснил ему ситуацию и "компетентность" их
специалистов, он пообещал что-нибудь сделать с этим.</p>
<p>Действительно, через несколько дней приехал к нам их специалист с VoIP-гейтвеем и хардварным
телефоном. Подключили, подождали пол-часа - связь отпала, как и ожидалось. При этом спец держал
связь с кем-то "с той стороны", кто мог потыкать оборудование, что-то там посмотреть и т.п. В
процессе этих ковыряний было высказано предположение, что возможно в билайновской сети IP-шник,
который был выдан нам, уже где-то используется. Предложил им посмотреть на каком-нибудь своём
оборудовании, какой mac они видят до отвала и после.</p>
<p>Ну <strong>так и оказалось - выданный нам IP-шник до этого уже был выдан какому-то клиенту.</strong> Отсюда все
сетевые проблемы и происходили. Пришедший специалист был в шоке от того, что у них произошло такое
распиздяйство. Сразу, как подтвердилась эта догадка, я просто был вылитый форман.jpg.</p>
<p><img src="/static/media/forman.jpg" alt="forman.jpg" /></p>
<p><strong>В общей сложности, данная проблема решалась больше месяца</strong>, с 22.06.2016 по 3.08.2016.</p>
/2016/05/08/emu10k1-lowpass/Настройка звука 5.1 на SB Live! (emu10k1) со срезом верхов на сабвуфере2016-05-08T00:00:00Z2016-05-08T00:00:00Z
<h2>Что вообще делаем</h2>
<p>Допустим, у нас есть "тупой" усилитель и акустическая система 5.1. И надо красиво вывести звук из
linux чтобы ничего не пердело и не хрипело.</p>
<p>Через функциональность alsa переопределяем путь звука, последовательно прогоняя его через различные
"плагины". Наруливаем разводку stereo на 6 каналов, а канал саба с помощью LADSPA прогоняем через
фильтр, который отрезает высокие частоты, а на сателлитах отрезаем низкие частоты.</p>
<p>Кстати, в интернете можно встретить примеры среза частот с использованием протухшего BLOP. Мы
заюзаем более актуальный инструмент.</p>
<h1>Предыстория, или ремонт трансформатора</h1>
<p>Всё началось с месяц назад, когда у меня в акустической системе Microlab AH-500 сдох силовой
трансформатор. Это тороидальный понижающий трансформатор с двумя вторичными обмотками. Понижение
10-и кратное, т.е. 220 -> 22. Проверка мультиметром показала, что в первичной обмотке обрыв цепи.
Смотал вторичную обмотку, и когда показалась первичная, оказалось, что там стоит
термопредохранитель на 130 градусов, и вот он-то и сдох. Перемотал обратно вторичную обмотку,
геморой тот ещё. Рекомендую посмотреть ну например <a href="https://www.youtube.com/watch?v=NCU_tb21M6I">это
видео</a>. Для ускорения процесса обмоточный провод
собирается в шпульку, чтобы не протаскивать всю длину провода на каждом витке. Отдельно надо
сказать, что натягивать провод надо СИЛЬНО, чтобы изнутри тора витки ложились прямо чётко один к
другому. Иначе пойдёт нахлёст, и отверстие в торе станет так мало, что туда не влезет крепёжный
болт. FAIL. У меня так и произошло, поэтому вторичку пришлось мотать два раза.</p>
<p>При обратной "сборке" трансформатора термопредохранитель взял номиналом поменьше, а именно, на 100
градусов, и поставил его снаружи вторичной обмотки. В общем, всё успешно собрал обратно, акустика
завелась как и было.</p>
<p>В процессе ковыряний с трансформатором наткнулся на то, что некоторые люди подключают звуковуху
напрямую на оконечный усилитель (в AH500 он конструктивно выполнен в сабвуфере) без преампа. Таким
образом избавляемся от ряда помех и шумов, вносимым данным оборудованием в звуковой тракт.</p>
<p>В таком варианте получается, что усилитель всё время раскрыт полностью, и нам нужно контролировать
мастер-громкость на стороне компьютера, плюс неплохо бы срезать высокие частоты из канала сабвуфера,
и опционально срезать низы на сателлитах.</p>
<h2>Пакеты</h2>
<ul>
<li>alsa-plugins: тут нас интересует плагин upmix. Он позволяет раскидать стерео звук на 6 каналов. Документация
/usr/share/doc/alsa-plugins-*/upmix.txt.bz2</li>
<li>ladspa-cmt: собственно <a href="https://ru.wikipedia.org/wiki/LADSPA">LADSPA</a>, интерфейс для подключения
фильтра</li>
<li>swh-plugins: тут у нас непосредственно ladspa-плагины, в том числе тот, которым будем срезать
верха.</li>
</ul>
<h2>.asoundrc</h2>
<p>Настройка осуществляется через .asoundrc, или /etc/asound.conf, если хочется системно. Читать его следует снизу вверх. Далее
следуют секции с комментариями к ним.</p>
<p>После прохождения через фильтры звук надо преобразовать из float в integer, без этого вроде как не работает (не проверял).
Отсюда звук уходит на определённый в alsa девайс surround51 - 5.1-канальный вывод.
Дефиниции можно глянуть в /usr/share/alsa/pcm/surround51.conf (там кстати есть раскладка по
каналам) ну и для интереса - карты. У меня это /usr/share/alsa/cards/EMU10K1.conf.
Тут на всякий случай можно сказать, что если отправлять звук не на surround51, а на какой-нибудь
дефолтный, то получите совсем не то, что ожидалось, т.к. туда уйдут только первые два канала, т.е.
фронты левый и правый, и уже там дальше с них "размиксуются" тылы, центр и саб. И таким образом срезка
работать не будет.</p>
<pre><code># Convert float data from "lowpass51" to integer data
# and pass it on to the next device.
pcm.lowpass_float {
type lfloat
slave {
pcm "surround51"
format "S16_LE"
}
}
</code></pre>
<p>Основная магия. 0-й плагин делает пропуск без изменений тех каналов, которые не
будут далее затронуты другими плагинами, 1-6 - отрезают низы на сателлиты, а 6-й отрезает верха на
канале сабвуфера. id - непосредственно идентификатор нужного фильтра. В секции controls - частота
среза. В данном конфиге 0-й плагин на самом деле не нужен, т.к. через фильтры проходят все каналы.
Но для примера решил оставить, вдруг кому-то не потребуется делать срез частот на каких-то каналах.</p>
<pre><code># Lowpass filter.
# Requires "ladspa" for plugin support,
# "cmt" for identity_audio plugin and
# "swh-plugins" for lpf plugin.
# See http://www.ladspa.org/.
pcm.lowpass51 {
type ladspa
slave.pcm "lowpass_float"
path "/usr/lib64/ladspa"
plugins {
# Copies all audio of all channels to other plugins.
# If no other plugin handles a channel, it comes out unchanged.
0 {
id 1098 # Identity (Audio) (1098/identity_audio)
policy duplicate
input.bindings.0 "Input";
output.bindings.0 "Output";
}
1 {
id 1052 # High Pass Filter
policy none
input.bindings.0 "Input";
output.bindings.0 "Output";
input {
controls [ 100 ]
}
}
2 {
id 1052 # High Pass Filter
policy none
input.bindings.1 "Input";
output.bindings.1 "Output";
input {
controls [ 100 ]
}
}
3 {
id 1052 # High Pass Filter
policy none
input.bindings.2 "Input";
output.bindings.2 "Output";
input {
controls [ 100 ]
}
}
4 {
id 1052 # High Pass Filter
policy none
input.bindings.3 "Input";
output.bindings.3 "Output";
input {
controls [ 100 ]
}
}
5 {
id 1052 # High Pass Filter
policy none
input.bindings.4 "Input";
output.bindings.4 "Output";
input {
controls [ 100 ]
}
}
# Actual low-pass filter functionality.
# Operate on channel 5 (LFE) and remove
# frequencies higher than X Hz.
6 {
id 1051 # Low Pass Filter (One Pole) (1051/lpf)
policy none
input.bindings.5 "Input";
output.bindings.5 "Output";
input {
controls [ 300 ]
}
}
}
}
</code></pre>
<p>Тут у нас происходит раскидка стерео на 5.1. Upmix копирует фронтальные каналы в соответствующие
тыловые с небольшим добавлением задержки (delay), по дефолту 15 ms. Центр и саб - среднее от суммы
левого и правого канала.</p>
<pre><code># Automatic upmixing. Requires package "alsa-plugins".
pcm.upmix51 {
type upmix
# Simply "lowpass51" won't work.
# "plug:..." specifies a plug device like
# the long form for the default device below
# and takes care of channel/format conversions
# automatically.
slave.pcm "plug:lowpass51"
# Specifying the number of channels to upmix to here is mandatory.
channels 6
}
</code></pre>
<p>Т.к. аппаратной крутилки мастер-уровня теперь нет, появилась потребность удобно рулить громкостью
всех каналов одновременно, чтобы не крутить всё в alsamixer-е по-отдельности. Без указания min_dB
max_dB регулятор не работал (всегда был на максимуме). Так же тут следует упомянуть, что в миксере
он появится только после первой попытки использования, т.е. надо проиграть что-нибудь. Простого
редактирования .asoundrc недостаточно. Так же можно убедиться в его появлении в <em>amixer controls</em>.</p>
<pre><code># Custom master volume control
pcm.softvol {
type softvol
slave.pcm "upmix51"
min_dB -51.0
max_dB 0.0
control {
name "SoftMaster"
card 0
}
}
</code></pre>
<p>Собственно первый в цепочке дефольный девайс, куда попадает звук от всех приложений, если в них не
выбрано что-то не-дефолтное. Тут мы берём весь звук и отправляем на цепочку обработки в "softvol"
и далее.</p>
<pre><code># Default device to be used by all applications playing all sorts of sources.
# There's automatic upmixing for 2.0 sources and native playback of 5.1 sources.
# (possibly others as supported by the upmix plugin)
pcm.!default {
type plug
slave.pcm "softvol"
}
</code></pre>
<h2>Софтварный миксер</h2>
<p>Для интереса я пробовал так же подключать в цепочку софтварный миксер dmix, но такая конфигурация
нормально не заработала. Конфиг примерно такой:</p>
<pre><code># The first ALSA device of the first soundcard
# (here: Analog Multichannel Ouput).
# See /proc/asound and "aplay -l".
pcm.sndcard {
type hw
card 0
device 0
}
# Dmix software mixing device.
# Takes multiple input streams, resamples them to target
# rate (here: 48kHz) and sends it to the sound card.
pcm.dmix51 {
type dmix
ipc_key 1024
slave {
#pcm "sndcard"
pcm "surround51"
channels 6
rate 48000
period_time 0 # Fixes audio crackling/stutter
period_size 1024 # with libsamplerate and chromium.
buffer_time 0 # Not all options may be
buffer_size 4096 # absolutely necessary.
}
}
# Convert float data from "lowpass51" to integer data
# and pass it on to the next device.
pcm.lowpass_float {
type lfloat
slave {
pcm "dmix51"
format "S16_LE"
}
}
</code></pre>
<p>Если из этого dmix51 отправлять звук на "surround51", получаем ошибку "Invalid type 'multi' for
slave PCM". Если же отправлять на "sndcard", то от 6-и каналов остаётся 2, и все усилия по срезанию
частот оказываются зря.</p>
<h2>Настройки миксера</h2>
<p>На всякий случай пояснение по настройкам регуляторов в alsamixer для моей карты на чипе SigmaTel
STAC9708,11:</p>
<ul>
<li>Master, PCM - ругулируют громкость фронтов.</li>
<li>Center, LFE - регулируют громкость центра и саба при выводе звука на "surround51". При выводе
просто на default device (типа hw:0,0) на звук не влияют.</li>
<li>Wave - громкость фронтов в режиме "default device", работает в совокупности с Master и PCM.</li>
<li>Wave Surround - тылы в режиме "default device".</li>
<li>Wave Center, Wave LFE - центр и саб в режиме "default device".</li>
</ul>
<h2>Биндинг на хоткеи i3</h2>
<p>Чтобы удобно рулить громкостью глобально, биндим их на хоткеи. Для i3 это выглядит так:</p>
<pre><code># global volume controls
bindsym $mod+Shift+Up exec amixer -q set SoftMaster 2dB+ unmute
bindsym $mod+Shift+Down exec amixer -q set SoftMaster 2dB- unmute
</code></pre>
<h2>Проблема с transcribe</h2>
<p>Для снятия музыкальных партий я использую программу Transcribe, и оказалось, что при выводе звука на
surround51 при воспроизведении появились неприятные потрескивания. Откуда оно взялось, выяснить не
удалось, поэтому пришлось настроить в ней вывод звука минуя всю цепочку surround51. Для этого в
настройках Playback указываем "Gstreamer device name" - "alsasink device=hw:0,0"</p>
<h2>Полезные ссылки, которые пригодились</h2>
<ul>
<li><a href="https://bbs.archlinux.org/viewtopic.php?id=168026">ALSA automatic upmixing with lowpass filtering and dmix
support</a></li>
<li><a href="http://superuser.com/questions/960573/how-do-i-make-alsa-upmix-2-0-to-2-1">How do I make ALSA upmix 2.0 to
2.1?</a></li>
<li><a href="https://forums.gentoo.org/viewtopic-p-4528619.html">
asound.conf: Filter for Subwoofer Channel? [nearly
solved]</a></li>
<li><a href="http://alsa.opensrc.org/How_to_use_softvol_to_control_the_master_volume">How to use softvol to control the master
volume</a></li>
</ul>
/2015/07/11/alternative-ways/Альтернативные дороги2015-07-11T00:00:00Z2015-07-11T00:00:00Z
<p>Решил сделать себе памятку по альтернативным дорогам в некоторые места. Последние пару лет доводится
ездить по направлениям Тюмень - Урал, Тюмень - Тольятти.</p>
<h2>Тюмень - Тургояк (Миасс, Златоуст, выезд на M5 с целью ехать дальше на юг)</h2>
<p>Тут у нас люди обычно ездят 2-я путями:</p>
<ol>
<li><strong>Тюмень - Курган - Челябинск - M5 - Златоуст</strong> (<a href="https://maps.yandex.ru/?rtext=57.153019%2C65.534337~55.447049%2C65.004055~55.028070%2C61.628231~55.171488%2C59.672641&rtt=auto&ll=61.117964%2C56.684237&z=7&via=1~2">620
км</a>)</li>
<li><strong>Тюмень - Шадринск - Челябинск - М5 - Златоуст</strong> (<a href="https://maps.yandex.ru/?rtext=57.153019%2C65.534337~56.098244%2C63.989545~55.028069%2C61.628233~55.171488%2C59.672641&rtt=auto&ll=62.616110%2C56.047995&z=8&via=1~2">570
км</a>)</li>
</ol>
<p>Оба эти пути не очень хорошие: Курган-Челябинск - большой поток фур, ремонты дорог с пропуском по
очереди. Шадринск - фур нет, но очень хреновая дорога от границ Тюменской области. Эту дорогу
потихоньку тоже ремонтируют, но пока что она не очень пригодна для быстрой езды. Я там ездил не
быстрее 70-80, часто приходится оттормаживаться до 20-30.</p>
<h3>Альтернативная дорога:</h3>
<ol>
<li><strong>Тюмень - дорога на Екатеринбург - Студенческий - Большебрусянское - Кадниково - M5 - Касли -
Карабаш - Златоуст</strong> (<a href="https://maps.yandex.ru/11212/miass/?ll=60.044211%2C55.108214&z=11&rtext=57.152960%2C65.534220~56.694928%2C61.260387~56.611677%2C61.083124~55.630820%2C60.474223~55.171488%2C59.672641&via=1~2~3&rtt=auto">560
км</a>)
По этому пути дорога практически везде хорошая, только возле Карабаша есть не очень хорошие участки.
Но, в любом случае, тут гораздо лучше чем через Шадринск, и от поворота с дороги на Ёбург до
Златоуста потока фур нет (не считая участка на M5).
Если по этому пути смотреть расстояние до Сима, получается 720 км.</li>
<li><strong>Тюмень - дорога на Екатеринбург - Талица - Бутка - Параткуль - Далматово - Новый быт - Касли -
Карабаш - Златоуст</strong> (<a href="https://maps.yandex.ru/?rtext=57.153019%2C65.534337~57.003541%2C63.737875~56.677954%2C63.782985~56.292663%2C63.174783~56.297833%2C62.438131~55.171365%2C59.672668&rtt=auto&ll=62.088042%2C56.218329&z=9&via=1~2~3~4">560
км</a>).
Этот маршрут вычитал на форуме, пока не ездил по нему. Тут вырисовывается преиущество - объезжаем
переезд в Богдановиче, где можно встрять минут на 40. Однако, тут есть участок между Новая и
Беляковка, где проезжать рекомендуют только на внедорожнике. См
<a href="http://www.car72.ru/forum/viewtopic.php?p=2303013#p2303013">отзыв</a></li>
<li><p><strong>Тюмень - Екатеринбург - Нижние Серги - Михайловск - Большие Карзи - Сажино - Новый Бугалыш -
Месягутово - выезд на М5 между Усть-Катавом и Симом</strong> (<a href="https://maps.yandex.ru/?ll=58.490513%2C55.520168&z=8&rtext=57.153019%2C65.534337~56.654743%2C59.295717~56.437323%2C59.114042~56.304595%2C58.344347~56.322584%2C58.194715~56.076836%2C58.115091~54.990783%2C57.690059&rtm=atm&rtt=auto&via=5">750
км</a>).
Этот маршрут подсказали Екатеринбуржские товарищи. Сам пока им не ездил. Вот описание:</p>
<ol>
<li>Из Екб выезжаешь мимо Меги в сторону Перми</li>
<li>Через 2км после поста ДПС в Дружинино надо по указателю повернуть на Нижние Серги</li>
<li>Едешь по отличной дороге мимо Нижних Серег, Михайловска. Дорога закончится длинным спуском и кольцом у
пос. Арти. Здесь едешь по кольцу прямо. Можно поесть в кафе "Вечный зов"</li>
<li>Через 5 км плохой дороги на перекрёстке - налево, на Б.Карзи</li>
<li>На этой дороге будет стоять знак 40 и обгон запрещён - на этом участке реально надо ехать 20 :))
Там 1 км сплошных ям</li>
<li>В Б.Карзях увидишь справа дорогу, идущую взад и вверх - тебе туда</li>
<li>На этой дороге не прозевай село Сажино. Там на карте не нарисовано, но реально главная дорога
идёт мимо села. Тебе надо повернуть налево</li>
<li>Проезжаешь сквозь Сажино - всё по главной. Едешь через 3 села, объезжая пьяных деревенских, до
трассы. На развилке будет кафе "Париж" и АЗС Лукойла. Тебе налево</li>
</ol></li>
</ol>
<p>В прошлом году был актуален ремонт моста в Симе, там была многокилометровая пробка. Я её объехал
окольными путями когда возвращался из Тольятти через какие-то ебеня по грунтовой дороге, в итоге
выехав на Миньяр и далее в Сим.</p>
<p>Если повозиться с картой, можно накидать маршрут на выезд к M5 уже после Уфы, например что-то такое: </p>
<ol>
<li><strong>Тюмень - Екатеринбург - Красноуфимск - Сарана - Ненастье - Октябрьский - Аскино - Старобалтачево -
Бураево - Дюртюли - Шаран - Туймазы - Октябрьский (M5) - Тольятти</strong>
(<a href="https://maps.yandex.ru/?ll=60.251536%2C56.087228&z=8&rtext=57.152965%2C65.534229~56.741598%2C61.166519~56.788696%2C58.574112~56.479168%2C57.739692~56.509352%2C57.223094~56.078002%2C56.569445~55.488552%2C54.794023~54.804871%2C53.992533~53.508875%2C49.419243&via=1~2~3~4~5~6~7&rtt=auto">1300
км</a>)
Какая там дорога, я естественно не в курсе. Было бы интересно сгонять этим маршрутом. Через Карабаш - Златоуст до Тольятти выходит так же 1300 км.</li>
</ol>
<p>На этом пока всё, в дальнейшем буду пополнять этот пост другими маршрутами, если возникнет
необходимость.</p>
/2015/03/18/rpc-fragment-too-large/RPC: fragment too large:2015-03-18T00:00:00Z2015-03-18T00:00:00Z
<p>Недавно после перезапуска nfs-сервера столкнулись с тем, что клиенты стали криво работать,
наблюдалась всякая страннота. При этом в логах сервера было множество ошибок вида</p>
<p><code>
Mar 18 11:24:46 samba2 kernel: [ 5169.020249] net_ratelimit: 9832 callbacks suppressed
Mar 18 11:24:46 samba2 kernel: [ 5169.020969] RPC: fragment too large: 524428
Mar 18 11:24:46 samba2 kernel: [ 5169.021336] RPC: fragment too large: 524428
</code></p>
<p>Перед этим виртуальной машине с nfs-сервером была подрезана RAM. Так вот, оказывается,
/proc/fs/nfsd/max_block_size вычисляется исходя из RAM, поэтому при перезапуске это значение
уменьшилось, а клиенты продолжали работать со старым значением wsize, что и вызывало указанные
ошибки. Пока разобрались, в виртуалке с nfs два раза наглухо пропадала сеть.</p>
/2014/09/24/postgresql-tuning/Тюнинг некоторых параметров PostgreSQL2014-09-24T00:00:00Z2014-09-24T00:00:00Z
<p>В процессе настройи автовакуума на postgres на работе я накидал небольшую документацию по этому
процессу. Т.к. в рунете что-то не густо такого материала, я решил опубликовать и тут,
да и себе на будущее тоже пригодится.</p>
<p>Будем считать, что вы уже прочитали родную документацию PostgreSQL, но не совсем её раздупляете,
поэтому я так сказать простым языком кое-что поясню.</p>
<p>Допустим, вы уже знаете про <a href="https://github.com/gregs1104/pgtune">pgtune</a> и пользуетесь этой
утилитой. Если нет, то советую ознакомиться с ней (если конечно вы не крутой DBA, который и так всё
в состоянии накрутить).</p>
<h2>Тюнинг параметров</h2>
<p>Для начала вообще почитайте про сам postgres:
<a href="http://www.slideshare.net/FedericoCampoli/postgresql-dba-01">http://www.slideshare.net/FedericoCampoli/postgresql-dba-01</a></p>
<p>И wiki на предмет тюнинга:
<a href="https://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server">https://wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server</a></p>
<h3>Логирование</h3>
<pre><code>log_line_prefix = '%t:%r:%u@%d:[%p]: '
</code></pre>
<p>Включаем логирвоание временных файлов:</p>
<pre><code>log_temp_files = 0
</code></pre>
<p>Если в логе видим использование временных файлов, значит надо увеличить work_mem.</p>
<h3>Тюнинг write performance</h3>
<p>Если идёт много транзакций (особенно updates), имеет смысл поднять кол-во checkpoint_segments и
увеличить интервал между чекпойнтами. Т.о. сброс dirty-буферов на диск будет происходить реже и
более размазаннее по времени. Так же, pgtune всегда выставляет <em>checkpoint_completion_target = 0.9</em>, это оптимально.</p>
<h3>Тюнинг autovacuum_freeze_max_age</h3>
<p><a href="http://www.databasesoup.com/2012/09/freezing-your-tuples-off-part-1.html">Отличная статья про проблему с wraparound-ом
транзакций</a>
<a href="http://www.postgresql.org/docs/current/static/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND">http://www.postgresql.org/docs/current/static/routine-vacuuming.html#VACUUM-FOR-WRAPAROUND</a></p>
<p><em>autovacuum_freeze_max_age</em> по дефолту - 10% (200 миллионов) от максимального XID (2.1 миллиард),
можно смело увеличивать до 50% - 1 миллиард. Правильный способ не допускать подхода к
autovacuum_freeze_max_age - вручную делать VACUUM FREEZE когда база мало используется.</p>
<p><em>vacuum_freeze_min_age</em> - надо проанализировать сколько транзакций идёт в час, и выставить такое
значение, чтобы транзакций хватало на несколько часов. Дефолт - 100 миллионов, довольно большой, это
значит, что превентивный фризинг обычно не происходит. Плюс, после freeze остаётся много XIDs,
которые близки к 50% от дефолтного autovacuum_freeze_max_age.</p>
<p><em>vacuum_freeze_table_age</em>: вакуум обходит только dirty части таблицы, всё остальное остаётся
нетронутым. Поэтому через какое-то время это "всё остальное" перехерачит autovacuum, который
запустится по достижении autovacuum_freeze_max_age. vacuum_freeze_table_age позволяет перехерачить
таблицу целиком заранее. Оптимальное значение - 80% от autovacuum_freeze_max_age, т.е. 800
миллионов.</p>
<p>В периоды наименьшей загруженности можно самостоятельно выполнять VACUUM FREEZE "мягким"
вакуумом, но более глубоко:</p>
<pre><code>vacuum_cost_delay = 50 # soft vacuum
vacuum_freeze_table_age = 50% от autovacuum_freeze_max_age
vacuum_freeze_min_age = 10% от обычного значения
</code></pre>
<h3>Тюнинг автовакуума для поддержки минимального bloat</h3>
<p><a href="http://www.postgresql.org/docs/9.2/static/routine-vacuuming.html">Описание автовакуума</a></p>
<p>Дефолтные настройки автовакуума рассчитаны на прогон ваккума по таблице в том случае, если было
изменено/удалено 20% её tuples. Это означает, что на таблице, у которой происходит примерно
постоянное кол-во updates/inserts/deletes <a href="http://habrahabr.ru/post/169939/">bloat</a> так же будет
держаться на уровне 20%, т.е. примерно 20% занимаемого места на диске на самом деле являются
"ненужным хламом" (старые версии rows) + участками пустого места в страницах. Если взять для примера
нашу базу receiver и её таблицу marks, которая партиционируется по месяцам, это означает, что по
прошествии месяца эта месячная таблица так и остаётся с 20% bloat-а. При этом если изменить
настройки автовакуума, они никак не смогут снизить bloat в этих старых таблицах, т.к. с ними нет
активной работы (inserts/updates). На таких таблицах надо делать VACUUM FULL или применять
<a href="https://github.com/grayhemp/pgtoolkit">pgcompactor</a> (recipe[postgresql::pgcompactor]).</p>
<p>Таким образом, возникает потребность настроить автовакуум таким образом, чтобы он запускался чаще,
при меньшем кол-ве сделанных updates/deletes. Самый главный параметр, который отвечает за
периодичность запусков - autovacuum_vacuum_scale_factor (по дефолту 0.2 -> 20%).
Соотвественно, исходя из размера наших таблиц и кол-ва tuples в них, подсчитываем допустимый для нас
уровень bloat. Например для базы receiver и таблиц marks*: таблица marks_YYYY_mm весит до 50GB,
допустим нам надо чтобы "хлама" и пустого места в ней было не более 1GB. 1024/(50*1024) = 0.02. При
этом опять же надо иметь в виду, что при слишком низком значении автовакуум будет работать
непрерывно.</p>
<h3>Тюнинг влияния автовакуума на I/O</h3>
<p><a href="http://www.postgresql.org/docs/9.1/static/runtime-config-resource.html">http://www.postgresql.org/docs/9.1/static/runtime-config-resource.html</a></p>
<p>Мы всегда хотим, чтобы автовакуум не мешал работе "рабочих" запросов, т.е. работал в фоновом режиме
с объёмом I/O, который не мешает. С другой стороны, если СУБД и так уже сильно нагружена, слишком
"расслабленные" настройки автовакуума приведут к тому, что bloat % будет выше ожидаемого. Сейчас
postgres (9.3) не имеет встроенного в автовакуум анализатор активности, т.е. он не может работать
адаптивно нагрузке (более интенсивно, когда нагрузка маленькая, и менее интенсивно, когда большая).
Поэтому мы вынуждены "на глаз" (проанализировав нагрузку на IO сервера) и соответственно настроить
<em>cost</em> параметры автовакуума.</p>
<ul>
<li><em>autovacuum_max_workers = 3</em> - кол-во рабочих процессов</li>
<li><em>autovacuum_vacuum_cost_delay = 20ms</em> - на сколько миллисекунд засыпает автовакуум при достижении
cost-лимита</li>
<li><em>autovacuum_vacuum_cost_limit = 200</em> - кол-во неких credits (пор них можно думать, что они являются
мерой измерения I/O операций)</li>
<li><em>vacuum_cost_page_hit = 1</em> # 0-10000 credits - цена за чтение буфера из кэша</li>
<li><em>vacuum_cost_page_miss = 10</em> # 0-10000 credits - цена за чтение буфера с диска</li>
<li><em>vacuum_cost_page_dirty = 20</em> # 0-10000 credits - цена за то, что в результате работы
вакуума буфер станет dirty (потребуется его запись на диск)</li>
</ul>
<p>Если у нас много таблиц, в которых происходит запись/удаление, имеет смысл увеличить кол-во
воркеров. Нужно иметь в виду, что cost-ы от всех процессов автовакуума суммируются.
Базовый параметр, который тюним - это autovacuum_vacuum_cost_delay. Смотрим какая нагрузка, тюним,
смотрим. Более тонко подгоняем с помощью выставления autovacuum_vacuum_cost_limit.
Цены за доступ к буферам так же можно потюнить - например, цену за чтения из кэша выставить в 0,
цену за чтение с диска немного понизить, а за запись - повысить.</p>
<p>Суть настройки заключается в том, чтобы дать автовакууму максимально возможное I/O до той
границы, после которой начнётся снижение производительности "рабочих" запросов.</p>
<p>P.S. DBA приглашаются пинать меня в комментах. Я могу в чём-то тут ошибаться, не стесняйтесь меня
потыкать.</p>