Previous Entry Share Next Entry
Агрегация трафика
shixaro wrote in opentorrent
Учет трафика по данным, сообщаемым трекеру торрент-клиентам, идет постоянными вставками в базу с таймштампами (чтобы можно было вести счетчики помесячные, посуточные и т.д.). Этот трафик постоянно двигается и агрегируется по планировщику. Доселе агрегацию выполнял внешний (перловый) скрипт, который делал 3 выборки, и обновлял счетчики. Так как постепенно мы подобное хозяйство изживаем, то агрегатор был перенесен внутрь БД в виде отдельной функции, что намного удобнее во многих отношениях.

Работа скрипта c одним циклом на двух миллионах записей и 20 тысячах уникальных пользователей:

# time ./agregate.pl

real 1m47.701s
user 0m9.189s
sys 0m5.592s


Работа функции с одним лупом:

tracker=# EXPLAIN ANALYZE select agregate_users_traff();
QUERY PLAN
------------------------------------------------------------------------------------------
Result (cost=0.00..0.26 rows=1 width=0) (actual time=4552.722..4552.722 rows=1 loops=1)
Total runtime: 4552.733 ms
(2 rows)


4.5 секунды против почти двух минут. Замеров делалось несколько, но и без этого очевидно (и я об этом всегда говорю), что нужно доверять базе и то, что можно крутить внутри - нужно крутить внутри. Естественно, без фанатизма и не переходя границы здравого смысла, засовывая в нее все подряд. Прокручивание потоков внутри базы как отдельно взятого модуля системы происходит значительно быстрее, чем когда потоки выводятся во внешнее приложение, которое управляет ими.

?

Log in