2013-01-05 01 Леонид Евдокимов. web scale. Взорвется все
DESCRIPTION
TRANSCRIPT
Web Scale
Взорвётся всё
Леонид Евдокимов
Второй омский IT-субботник, январь 2013, vk.com/omskit
О чём
Juggler рост нагрузки с 1k до 10k машин
MongoDB о свойствах и особенностях
Python о доставке сигналов смеха для
MySQL о пользе суррогатных ключей
Linux об учете накладных расходов
FreeBSD о внезапной сложности простого
Juggler
Система мониторинга событий
Внутри: MySQL, MongoDB, Python
В обвязке: nginx или lighttpd, flup или uWSGI
Подробнее: «Мониторинг со всех сторон»
YaC 2011, Алексей Симаков, clck.ru/L5GF
MongoDB
NoSQL СУБД
Быстрая как /dev/null
Не использует JOIN
mongodb-is-webscale.com
MongoDB
find({x:1})
vs.
update({x:1},
{$set:{pad:"A…A"}})
MongoDB
> find({x: 1})
{"_id": ObjectId("4f…c3"), "x": 1 }
{"_id": ObjectId("4f…c3"), "x": 1, "pad": "A…A" }
>
v2.0.2 — взорвано
MongoDB
double-update ≈ ½ quad damage
> update(..., {$push: {big object}})
«Scaling with MongoDB»
by Michael Schurter 2011
Слушатель, доверяй, но проверяй!
MongoDB
/usr/bin/mongod
vs.
/usr/sbin/logrotate
MongoDB
jira/SERVER-3339 — при ротации логов…
… stackoverflow в обработчике SIGABRT
… deadlock в malloc()
Починка базы медленнее, чем MyISAM!
MongoDB
jira/SERVER-3339 — при ротации логов…
… stackoverflow в обработчике SIGABRT
… deadlock в malloc()
Починка базы медленнее, чем MyISAM!
Ответ: db.runCommand("logRotate")
Python
Однопоточный
«Медленный»
GIL
Python
Однопоточный
«Медленный»
GIL
Ответ: multiprocessing
Python
/usr/lib/python2.7/multiprocessing
vs.
/usr/sbin/logrotate
Python
bugs/issue8296 — про multiprocessing
Происходит deadlock из-за EINTR и смерти одного из тредов
…ох уж эти сигналы!
Ответ: kill -9 -${sid}
:-)
MongoDB & Python
Окончательный ответ на вопрос logrotate, доставки сигналов и всего такого:
«Delivering Signals for Fun and Profit»
by Michal Zalewski
clck.ru/4RGgy
always look on the bright side of life vulnerability
MySQL
На этот раз не про сигналы
MySQL
На этот раз не про сигналы
В mysql все сигналы обрабатываются в отдельном потоке
На этот раз — про JOIN
MySQL
LEFT JOIN
vs.
RIGHT OUTER JOIN
MySQL
LEFT JOIN
vs.
RIGHT OUTER JOIN
На самом деле - нет
MySQL
SELECT … FROM t1 LEFT JOIN t2
ON t1.type = 'HOST'
AND t1.host_name = t2.object_name
AND t1.check_name = t2.check_name
LEFT JOIN t1_1 … LEFT JOIN t2_1 …
RIGHT OUTER JOIN t1_2 …
MySQL
mysqld: Incorrect key file for table
'/var/tmp/#sql17161_b3_3.MYI';
try to repair it
MySQL
SELECT … FROM t1 LEFT JOIN t2
ON t1.type = 'HOST'
AND t1.host_name = t2.object_name
AND t1.check_name = t2.check_name …
host_name, object_name, check_name
- varchar(128) COLLATE utf8_bin
MySQL
MEMORY maximum key length is 3072 bytes
MyISAM maximum key length is 1000 bytes
MySQL
MEMORY maximum key length is 3072 bytes
MyISAM maximum key length is 1000 bytes
Created_tmp_disk_tables: MEMORY → MyISAM
MySQL
MEMORY maximum key length is 3072 bytes
MyISAM maximum key length is 1000 bytes
Created_tmp_disk_tables: MEMORY → MyISAM
При выходе за key_len: MEMORY MyISAM↴
BADABOOM storage engine
MySQL
Помогают…
… суррогатные INTEGER ключи
… tmp_table_size & max_heap_table_size
You can’t hardware yourself out of a performance problem
you softwared yourself into.
– Cary Millsap
Linux & FreeBSD
Linux
/bin/ping
vs.
setsockopt(fd, SO_RCVBUF, …)
Linux
SO_RCVBUF
… The kernel doubles this value (to allow space for bookkeeping overhead).
– man 7 socket
Linux
А теперь пошлем ICMP PING на 10000 хостов
Перенесем «пинговалку» в vm на основе KVM
…
Linux
Задержка пакета от входа до recvmsg() возросла в десятки раз (пики до 50ms!)
RCVBUF, кажется, достаточно большой для нескольких тысяч 28-байтных пакетов
Но входящие PONG не помещаются в RCVBUF при такой задержке
Linux
Измеряем: gist.github.com/4454323
«Bookkeeping overhead» до ¾ kbyte / pkt
Накладные расходы в ≈27.5 раз выше описанных в man page
Linux
ICMP PING — не очень интересен
Что происходит в UDP (VoIP, игры) сокетах?
Почему KVM настолько повышает latency?
FreeBSD
rename()
vs.
FreeBSD-8.2
FreeBSD
Сказ о rename() и о том, как скушать все PID'ы и уснуть в D-state
● В N потоков: rename(tmp, dest_dir)
● В M потоков: exists(dest_dir/fname)
● Порождать новый worker-поток, если старый не ответил за время T
FreeBSD
В FreeBSD-9.0 VFS уже починили и этот deadlock в rename() исчез
Ответ: pool, queue & two strict ulimits
IT
Окончательный ответ на вопрос разработки, протекающих абстракций и всего такого:
Закон больших чисел
Взорвётся всё
Даже /dev/null. Я не шучу.