>>> разберись, сколько у тебя транзакций в первом и во втором случаях.
>> А как это сделать?
>> Насколько я понимаю, в случае скрипта - 1 транзакция, а в случае
>> libpq - 10000.
>> Но даже в этом случае, деградация в 141 раз - это за
>> гранью добра и зла.
> Т.е то, что в 10 000 раз большее число транзакций выполняется всего
> в 141 раз медленнее - это уже плохо? Отличная логика, правда
> несколько странная :-) 140 операций записи 8ми байт + служебной информации в секунду. Т.е. 1120 байт полезной информации можно сохранить за секунду.... маловато...
>> Всего 140 операций вставки в секунду (в таблицу с одним столбцом int8)
>> - это что-то странное. Т.к. Постгрес используется на нагруженных проектах, то
>> значит что-то я делаю не правильно.
> Посмотри, какую нагрузку на диски дает твой тест.
> 140 операций в секунду, это примерно и есть средняя производительность жесткого диска
> на случайных операциях. Или ты считаешь, что транзакция завершается "в воздух",
> а не записью на жесткий диск? Если транзакция не завершилась записью
> на диск - значит это не транзакция, а только её подобие.
нагрузка на диск идёт непропорциональная. Такое ощущение, что в каждой транзакции вставляется не 8 байтов, а десятки мегабайтов. На сервере стоят быстрые винты, тест производительности показывает 2.2 GB/s.
Вот как грузит CPU и IO Постгрес (синие палки - операции IO, зелёные - CPU):
Как вставить картинку - не знаю, поэтому дал ссылки:
http://s017.radikal.ru/i421/1606/e1/5f78641fa4c4.jpg
Время: 73 сек, процессор всё время ожидает операции ввода/вывода. На сохранение 80000 байт на диск не похоже.
А вот работа диспетчера заданий (это и есть целевое приложение) на mongodb (сервер этот же) - запись в БД и обработка 10000 заданий (всего около 50000 атомарных операций с БД, каждая запись примерно 96 байт), плюс запуск 10000 процессов php-fpm (обработчиков заданий).
http://s018.radikal.ru/i523/1606/c0/37650c524261.jpg
Время: ~6.3 сек (дебаговая сборка без оптимизации. С оптимизацией 5.5 сек), грузится практически только процессор, сохранение на диске занимает мизерное время.
Судя по всему, я что-то не так делаю, но не знаю в какую сторону рыть.
>> Через libpq после каждой операции должен выполняться автокоммит, он и выполняется.
>> Не выполнять его нельзя, т.к. запросы приходят от обработчиков сетевых соединений -
>> каждый запрос - атомарная транзакция, которая добавляет/изменяет данные в БД.
> Должен, можно, нельзя... Это всё условности.
Автокоммит должен выполняться по логике приложения. После поступления запроса данные должны сразу быть доступны в БД для процесса обработки.