<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Низкая производительность из libpq</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/10106.html</link>
    <description>Всем читающим это сообщение доброго времени суток.&lt;br&gt;&lt;br&gt;Возник вопрос с производительностью сервера Postgres 9.5 при работе через libpq из приложения, написанного на С.&lt;br&gt;&lt;br&gt;Тестировался вызов (10000 раз) хранимой ф-ции из скрипта PGSQL и из приложения. Результаты:&lt;br&gt;&lt;br&gt;&#091;b&#093;Скрипт:&#091;/b&#093; 503 msec. (19880.71570 операций вставки в секунду)&lt;br&gt;&#091;b&#093;Приложение:&#091;/b&#093; 71.241997 sec. (140.36664 операций вставки в секунду)&lt;br&gt;&lt;br&gt;Разница в &#091;b&#093;141.63418&#091;/b&#093; раз!!!111&lt;br&gt;&lt;br&gt;    &#091;b&#093;В чём может быть проблема такой деградации?&#091;/b&#093;&lt;br&gt;&lt;br&gt;&#091;b&#093;Описание системы:&#091;/b&#093;&lt;br&gt;&#091;code&#093;$ uname -a&lt;br&gt;Linux localhost.dev.resolute.ru 3.9.4 #3 SMP Tue May 28 14:26:24 EDT 2013 x86_64 x86_64 x86_64 GNU/Linux&lt;br&gt;&lt;br&gt;$ /usr/web/bin/pg_ctl --version&lt;br&gt;pg_ctl (PostgreSQL) 9.5.3&lt;br&gt;&#091;/code&#093;&lt;br&gt;&lt;br&gt;&#091;b&#093;Вызываемая процедура:&#091;/b&#093;&lt;br&gt;&#091;code&#093;create or replace function test_job(&lt;br&gt;inv_i_idint8,&lt;br&gt;outv_o_idint8&lt;br&gt;)&lt;br&gt;as&lt;br&gt;$$&lt;br&gt;begin&lt;br&gt;select n into v_o_id from test_t where n = 100;&lt;br&gt;insert into test_t(n) values (v_i_id);&lt;br&gt;end;&lt;br&gt;$$ language plpgsql&lt;br&gt;&#091;/code&#093;&lt;br&gt;&lt;br&gt;&#091;b&#093;Тестовый скрипт:&#091;/b&#093;&lt;br&gt;&#091;code&#093;do&lt;br&gt;$</description>

<item>
    <title>Низкая производительность из libpq (PavelR)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/10106.html#9</link>
    <pubDate>Wed, 08 Jun 2016 18:29:37 GMT</pubDate>
    <description>&amp;gt; Замерил использование диска iostat&apos;ом - запись 183464 блока (~90МБ), чтение 200 блоков &lt;br&gt;&amp;gt; (100кБ). Возникло два вопроса: &lt;br&gt;&amp;gt; 1. Это нормально, если при фиксации транзакции в 8 байт сохраняется более &lt;br&gt;&amp;gt; килобайта информации?&lt;br&gt;&lt;br&gt;1) Диски это блочные устройства. Они технически не пишут байты, а пишут блоки 512 байт / 4096 байт. Аналогично - файловые системы пишут блоки/страницы, а не байты.&lt;br&gt;&lt;br&gt;2) БД это не просто файлы. &lt;br&gt;&lt;br&gt;&amp;gt; 2. При скорости 2.2Гб в сек на запись 90Мб не могут писаться &lt;br&gt;&amp;gt; 70сек. &lt;br&gt;&lt;br&gt;&quot;Могут - не могут&quot;. Устроили тут... &lt;br&gt;&lt;br&gt;Еще раз:&lt;br&gt;&lt;br&gt;Вы не понимаете, как работают жесткие диски и меряете их производительность не в тех единицах.&lt;br&gt;&lt;br&gt;Линейная запись != случайная запись. В первом случае вы можете писать 2.2Гб/сек (при этом будет сколько-то-там операций в сек), во втором - будете ограничены ~200 операций в секунду, что даст на порядки меньшую скорость записи в байтах/сек.&lt;br&gt;Всё это будет 100&#037; загрузки жесткого диска.&lt;br&gt;&lt;br&gt;&amp;gt;Не знаете ли вы, где могут возникать блокировки, в какую  сторону копать?&lt;br&gt;&lt;br&gt;Вро</description>
</item>

<item>
    <title>Низкая производительность из libpq (koteg)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/10106.html#8</link>
    <pubDate>Wed, 08 Jun 2016 18:11:53 GMT</pubDate>
    <description>&amp;gt;&amp;gt; Такое ощущение, что в каждой транзакции вставляется &lt;br&gt;&amp;gt;&amp;gt; не 8 байтов, а десятки мегабайтов. На сервере стоят быстрые винты, &lt;br&gt;&amp;gt;&amp;gt; тест производительности показывает 2.2 GB/s.&lt;br&gt;&amp;gt; = &lt;br&gt;&amp;gt;&amp;gt; Время: 73 сек, процессор всё время ожидает операции ввода/вывода. На сохранение 80000 &lt;br&gt;&amp;gt;&amp;gt; байт на диск не похоже.&lt;br&gt;&amp;gt; Вы не понимаете, как работают жесткие диски и меряете их производительность не &lt;br&gt;&amp;gt; в тех единицах, а также смешиваете в одну кучу синхронные транзакции &lt;br&gt;&amp;gt; с гарантированной записью на диск и асинхронные транзакции с негарантированным сохранением. &lt;br&gt;&amp;gt; Определитесь с вашими потребностями, и дальше разбирайтесь например с этим: https://www.postgresql.org/docs/8.3/static/wal-async-commit.html &lt;br&gt;&lt;br&gt;Спасибо за совет, посмотрю асинхронные транзакции, завтра отпишусь.&lt;br&gt;Замерил использование диска iostat&apos;ом - запись 183464 блока (~90МБ), чтение 200 блоков (100кБ). Возникло два вопроса:&lt;br&gt;1. Это нормально, если при фиксации транзакции в 8 байт сохраняется более килобайта информации?&lt;br&gt;2. При скорости 2.2Гб в сек на запись </description>
</item>

<item>
    <title>Низкая производительность из libpq (PavelR)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/10106.html#7</link>
    <pubDate>Wed, 08 Jun 2016 17:41:56 GMT</pubDate>
    <description>&amp;gt; Такое ощущение, что в каждой транзакции вставляется &lt;br&gt;&amp;gt; не 8 байтов, а десятки мегабайтов. На сервере стоят быстрые винты, &lt;br&gt;&amp;gt; тест производительности показывает 2.2 GB/s.&lt;br&gt;&lt;br&gt;=&lt;br&gt;&amp;gt; Время: 73 сек, процессор всё время ожидает операции ввода/вывода. На сохранение 80000 &lt;br&gt;&amp;gt; байт на диск не похоже.&lt;br&gt;&lt;br&gt;Вы не понимаете, как работают жесткие диски и меряете их производительность не в тех единицах, а также смешиваете в одну кучу синхронные транзакции с гарантированной записью на диск и асинхронные транзакции с негарантированным сохранением. Определитесь с вашими потребностями, и дальше разбирайтесь например с этим: https://www.postgresql.org/docs/8.3/static/wal-async-commit.html&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Низкая производительность из libpq (koteg)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/10106.html#6</link>
    <pubDate>Wed, 08 Jun 2016 17:27:50 GMT</pubDate>
    <description>&amp;gt;&amp;gt;&amp;gt; разберись, сколько у тебя транзакций в первом и во втором случаях.&lt;br&gt;&amp;gt;&amp;gt; А как это сделать?&lt;br&gt;&amp;gt;&amp;gt; Насколько я понимаю, в случае скрипта - 1 транзакция, а в случае &lt;br&gt;&amp;gt;&amp;gt; libpq - 10000.&lt;br&gt;&amp;gt;&amp;gt; Но даже в этом случае, деградация в 141 раз - это за &lt;br&gt;&amp;gt;&amp;gt; гранью добра и зла.&lt;br&gt;&amp;gt; Т.е то, что в 10 000 раз большее число транзакций выполняется всего &lt;br&gt;&amp;gt; в 141 раз медленнее - это уже плохо? Отличная логика, правда &lt;br&gt;&amp;gt; несколько странная :-) &lt;br&gt;&lt;br&gt;140 операций записи 8ми байт + служебной информации в секунду. Т.е. 1120 байт полезной информации можно сохранить за секунду.... маловато...&lt;br&gt;&lt;br&gt;&lt;br&gt;&amp;gt;&amp;gt; Всего 140 операций вставки в секунду (в таблицу с одним столбцом int8) &lt;br&gt;&amp;gt;&amp;gt; - это что-то странное. Т.к. Постгрес используется на нагруженных проектах, то &lt;br&gt;&amp;gt;&amp;gt; значит что-то я делаю не правильно.&lt;br&gt;&amp;gt; Посмотри, какую нагрузку на диски дает твой тест.&lt;br&gt;&amp;gt; 140 операций в секунду, это примерно и есть средняя производительность жесткого диска &lt;br&gt;&amp;gt; на случайных операциях. Или ты считаешь, что транзакция завершается &quot;в воздух&quot;, &lt;br&gt;&amp;gt; а не записью на жес</description>
</item>

<item>
    <title>Низкая производительность из libpq (PavelR)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/10106.html#5</link>
    <pubDate>Wed, 08 Jun 2016 16:26:16 GMT</pubDate>
    <description>&amp;gt;&amp;gt; разберись, сколько у тебя транзакций в первом и во втором случаях.&lt;br&gt;&amp;gt; А как это сделать?&lt;br&gt;&amp;gt; Насколько я понимаю, в случае скрипта - 1 транзакция, а в случае &lt;br&gt;&amp;gt; libpq - 10000.&lt;br&gt;&amp;gt; Но даже в этом случае, деградация в 141 раз - это за &lt;br&gt;&amp;gt; гранью добра и зла.&lt;br&gt;&lt;br&gt;Т.е то, что в 10 000 раз большее число транзакций выполняется всего в 141 раз медленнее - это уже плохо? Отличная логика, правда несколько странная :-)&lt;br&gt;&lt;br&gt;&amp;gt; Всего 140 операций вставки в секунду (в таблицу с одним столбцом int8) &lt;br&gt;&amp;gt; - это что-то странное. Т.к. Постгрес используется на нагруженных проектах, то &lt;br&gt;&amp;gt; значит что-то я делаю не правильно.&lt;br&gt;&lt;br&gt;Посмотри, какую нагрузку на диски дает твой тест.&lt;br&gt;140 операций в секунду, это примерно и есть средняя производительность жесткого диска на случайных операциях. Или ты считаешь, что транзакция завершается &quot;в воздух&quot;, а не записью на жесткий диск? Если транзакция не завершилась записью на диск - значит это не транзакция, а только её подобие.&lt;br&gt;&lt;br&gt;&amp;gt; Через libpq после каждой операции должен выполняться автокоммит</description>
</item>

<item>
    <title>Низкая производительность из libpq (koteg)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/10106.html#4</link>
    <pubDate>Wed, 08 Jun 2016 14:35:09 GMT</pubDate>
    <description>&amp;gt; разберись, сколько у тебя транзакций в первом и во втором случаях.&lt;br&gt;&lt;br&gt;А как это сделать?&lt;br&gt;&lt;br&gt;Насколько я понимаю, в случае скрипта - 1 транзакция, а в случае libpq - 10000.&lt;br&gt;Но даже в этом случае, деградация в 141 раз - это за гранью добра и зла.&lt;br&gt;Всего 140 операций вставки в секунду (в таблицу с одним столбцом int8) - это что-то странное. Т.к. Постгрес используется на нагруженных проектах, то значит что-то я делаю не правильно.&lt;br&gt;&lt;br&gt;Через libpq после каждой операции должен выполняться автокоммит, он и выполняется. Не выполнять его нельзя, т.к. запросы приходят от обработчиков сетевых соединений - каждый запрос - атомарная транзакция, которая добавляет/изменяет данные в БД.&lt;br&gt;</description>
</item>

<item>
    <title>Низкая производительность из libpq (koteg)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/10106.html#3</link>
    <pubDate>Wed, 08 Jun 2016 14:27:36 GMT</pubDate>
    <description>&amp;gt; .. а также замени PQexecParams на PQprepare + PQexecPrepared &lt;br&gt;&lt;br&gt;Заменил. Полегчало, но не сильно, стало на 1 секунду хуже... Таперь код такой:&lt;br&gt;&#091;code&#093;const char* stmtName = &quot;TEST_JOB&quot;;&lt;br&gt;Oid oidTypes&#091;1&#093; = &#123;20&#125;;// int8 OID=20, int8&#091;&#093; OID=1016&lt;br&gt;res = PQprepare(conn, stmtName, &quot;select test_job($1::int8)&quot;, 1, oidTypes);&lt;br&gt;&lt;br&gt;for(i=0; i&amp;lt;10000; i++) &#123;&lt;br&gt;long long id = htonll(i);&lt;br&gt;paramValues&#091;0&#093; = (char*)&amp;id;&lt;br&gt;paramLengths&#091;0&#093; = 8;&lt;br&gt;paramBinary&#091;0&#093; = 1;&lt;br&gt;&lt;br&gt;res = PQexecPrepared(conn, stmtName, 1,&lt;br&gt;paramValues,&lt;br&gt;paramLengths,&lt;br&gt;paramBinary,&lt;br&gt;0&lt;br&gt;);&lt;br&gt;&lt;br&gt;status = PQresultStatus(res);&lt;br&gt;if((status != PGRES_COMMAND_OK)&amp;&amp;(status != PGRES_TUPLES_OK)) &#123;&lt;br&gt;printf(&quot;ERROR: &#037;s&#092;n&quot;, PQresultErrorMessage(res));&lt;br&gt;PQclear(res);&lt;br&gt;return 0;&lt;br&gt;&#125;&lt;br&gt;&#125;&lt;br&gt;&#091;/code&#093;&lt;br&gt;&lt;br&gt;&#091;b&#093;Время выполнения  72.068604 sec&#091;/b&#093;&lt;br&gt;</description>
</item>

<item>
    <title>Низкая производительность из libpq (PavelR)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/10106.html#2</link>
    <pubDate>Wed, 08 Jun 2016 13:28:20 GMT</pubDate>
    <description>разберись, сколько у тебя транзакций в первом и во втором случаях.&lt;br&gt;</description>
</item>

<item>
    <title>Низкая производительность из libpq (PavelR)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/10106.html#1</link>
    <pubDate>Wed, 08 Jun 2016 13:25:56 GMT</pubDate>
    <description>.. а также замени PQexecParams на PQprepare + PQexecPrepared &lt;br&gt;</description>
</item>

</channel>
</rss>
