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

- запросы к системе статистики логируются nginx'ом/лайтом в файлы, для каждого домена свой лог-файл (или даже несколько);
- скриптами в фоне эти лог-файлы постоянно парсятся;
- хиты это просто одно число-счётчик;
- с хоставми чуть сложнее, нужен какой-то быстрый key value storage, в который вставляются батчем новые ip (дубли игнорируются) и получается count что есть в сторедже (для каждого домена).
- картинка с циферками генерится отдельным процессом каждые там 0.5 сек
-~{}~ 26.05.10 18:52:
То-есть главное, чтоб не было никакой динамики при обращении клиентов - дёрнули статическую картинку с цифрами (предыдущими, без учёта этого хита), сервер записал обращение к себе в лог, в фоне обработал логи, сгенерил новую картинку и так постоянно.
Но это моё имхо, сам с подобным не сталкивался и не ресёрчил best practices на эту тему.
-~{}~ 27.05.10 01:06:
Стало интересно чего можно ожидать от простых технологий:
- nginx: пишет в access.log только ip и отдаёт картинку в 385 байт
- mysql: memory engine, таблица с одним полем ip (int) и уникальным индексом;
- php: запущен в фоне, проверяет обновление access.log'а, пишет в базу ip и в файл количество хитов, хостов (без генерации картинки со счётчиком)
Сервер по нынешним меркам слабый: P4 2.8Hz 1CPU, 2GB, FreeBSD 6.1
ab запускался с другого сервера из одной сети
Тест 1:
ab -c 1000 -n 2000000
http://domain/stat-test-1/test.png
Код:
Server Software: nginx/0.7.64
Document Path: /stat-test-1/test.png
Document Length: 385 bytes
Concurrency Level: 1000
Time taken for tests: 1024.416 seconds
Complete requests: 2000000
Failed requests: 393
(Connect: 169, Length: 224, Exceptions: 0)
Broken pipe errors: 0
Total transferred: 1191868284 bytes
HTML transferred: 769914915 bytes
Requests per second: 1952.33 [#/sec] (mean)
Time per request: 512.21 [ms] (mean)
Time per request: 0.51 [ms] (mean, across all concurrent requests)
Transfer rate: 1163.46 [Kbytes/sec] received
Connnection Times (ms)
min mean[+/-sd] median max
Connect: 0 369 1298.0 0 75006
Processing: 6 142 nan 126 88338
Waiting: 0 141 nan 125 88337
Total: 6 511 1280.5 145 122543
Загрузка:
- Load Average = 2.4
- nginx - 27% cpu
- mysql - 16% cpu
- php - 7% cpu
Тест 2:
отдельные 5 процессов ab -c 300 -n 1000000
http://domain/stat-test-[1...5]/test.png
на разные урлы, каждый пишет свой лог и ip в отдельную базу.
По всем ab примерно одинаковая картина:
Код:
Concurrency Level: 300
Time taken for tests: 2719.405 seconds
Complete requests: 1000000
Failed requests: 23
(Connect: 9, Length: 14, Exceptions: 0)
Broken pipe errors: 0
Total transferred: 595991656 bytes
HTML transferred: 384994610 bytes
Requests per second: 367.73 [#/sec] (mean)
Time per request: 815.82 [ms] (mean)
Time per request: 2.72 [ms] (mean, across all concurrent requests)
Transfer rate: 219.16 [Kbytes/sec] received
Connnection Times (ms)
min mean[+/-sd] median max
Connect: 0 665 1679.7 0 75002
Processing: 12 150 50.1 150 12259
Waiting: 2 149 50.1 149 12259
Total: 12 815 1683.7 157 75002
Загрузка:
- Load Average = 2.8
- nginx - 26% cpu
- mysql - 12% cpu
- php - 5%
Лаг со стороны php был не больше пары десятых секунды. При вставке данных, ошибок со стороны mysql не было.
Похоже всё упёрлось в дисковую подсистему, iostat'ы не смотрел, но проц был не на максимум загружен.
IP в mysql записывался не реальный (всегда постоянный), а просто значение переменной-счётчика, который увеличивался на 1 после каждых пяти запросов.
При пустой таблице и когда уже было 600K записей загрузка от mysql была одинаковой.
К чему это я всё, просто удовлетворил своё любопытство.
С хорошим сервером (4+ ядра) для небольшой системы статистики (до 2000 rps при небольшом количестве трекаемых источников)
можно даже пробовать обойтись решением в лоб на основе базовых технологий (но я это не пропагандирую).
nginx, freebsd никак особо не настраивались, в тесте не генерились картинки-счётчики.