![Page 1: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/1.jpg)
Web Scale
Взорвётся всё
Леонид Евдокимов
Второй омский IT-субботник, январь 2013, vk.com/omskit
![Page 2: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/2.jpg)
О чём
Juggler рост нагрузки с 1k до 10k машин
MongoDB о свойствах и особенностях
Python о доставке сигналов смеха для
MySQL о пользе суррогатных ключей
Linux об учете накладных расходов
FreeBSD о внезапной сложности простого
![Page 3: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/3.jpg)
Juggler
Система мониторинга событий
Внутри: MySQL, MongoDB, Python
В обвязке: nginx или lighttpd, flup или uWSGI
Подробнее: «Мониторинг со всех сторон»
YaC 2011, Алексей Симаков, clck.ru/L5GF
![Page 4: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/4.jpg)
MongoDB
NoSQL СУБД
Быстрая как /dev/null
Не использует JOIN
mongodb-is-webscale.com
![Page 5: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/5.jpg)
MongoDB
find({x:1})
vs.
update({x:1},
{$set:{pad:"A…A"}})
![Page 6: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/6.jpg)
MongoDB
> find({x: 1})
{"_id": ObjectId("4f…c3"), "x": 1 }
{"_id": ObjectId("4f…c3"), "x": 1, "pad": "A…A" }
>
v2.0.2 — взорвано
![Page 7: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/7.jpg)
MongoDB
double-update ≈ ½ quad damage
> update(..., {$push: {big object}})
«Scaling with MongoDB»
by Michael Schurter 2011
Слушатель, доверяй, но проверяй!
![Page 8: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/8.jpg)
MongoDB
/usr/bin/mongod
vs.
/usr/sbin/logrotate
![Page 9: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/9.jpg)
MongoDB
jira/SERVER-3339 — при ротации логов…
… stackoverflow в обработчике SIGABRT
… deadlock в malloc()
Починка базы медленнее, чем MyISAM!
![Page 10: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/10.jpg)
MongoDB
jira/SERVER-3339 — при ротации логов…
… stackoverflow в обработчике SIGABRT
… deadlock в malloc()
Починка базы медленнее, чем MyISAM!
Ответ: db.runCommand("logRotate")
![Page 11: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/11.jpg)
Python
Однопоточный
«Медленный»
GIL
![Page 12: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/12.jpg)
Python
Однопоточный
«Медленный»
GIL
Ответ: multiprocessing
![Page 13: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/13.jpg)
Python
/usr/lib/python2.7/multiprocessing
vs.
/usr/sbin/logrotate
![Page 14: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/14.jpg)
Python
bugs/issue8296 — про multiprocessing
Происходит deadlock из-за EINTR и смерти одного из тредов
…ох уж эти сигналы!
Ответ: kill -9 -${sid}
:-)
![Page 15: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/15.jpg)
MongoDB & Python
Окончательный ответ на вопрос logrotate, доставки сигналов и всего такого:
«Delivering Signals for Fun and Profit»
by Michal Zalewski
clck.ru/4RGgy
always look on the bright side of life vulnerability
![Page 16: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/16.jpg)
MySQL
На этот раз не про сигналы
![Page 17: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/17.jpg)
MySQL
На этот раз не про сигналы
В mysql все сигналы обрабатываются в отдельном потоке
На этот раз — про JOIN
![Page 18: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/18.jpg)
MySQL
LEFT JOIN
vs.
RIGHT OUTER JOIN
![Page 19: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/19.jpg)
MySQL
LEFT JOIN
vs.
RIGHT OUTER JOIN
На самом деле - нет
![Page 20: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/20.jpg)
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 …
![Page 21: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/21.jpg)
MySQL
mysqld: Incorrect key file for table
'/var/tmp/#sql17161_b3_3.MYI';
try to repair it
![Page 22: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/22.jpg)
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
![Page 23: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/23.jpg)
MySQL
MEMORY maximum key length is 3072 bytes
MyISAM maximum key length is 1000 bytes
![Page 24: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/24.jpg)
MySQL
MEMORY maximum key length is 3072 bytes
MyISAM maximum key length is 1000 bytes
Created_tmp_disk_tables: MEMORY → MyISAM
![Page 25: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/25.jpg)
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
![Page 26: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/26.jpg)
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
![Page 27: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/27.jpg)
Linux & FreeBSD
![Page 28: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/28.jpg)
Linux
/bin/ping
vs.
setsockopt(fd, SO_RCVBUF, …)
![Page 29: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/29.jpg)
Linux
SO_RCVBUF
… The kernel doubles this value (to allow space for bookkeeping overhead).
– man 7 socket
![Page 30: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/30.jpg)
Linux
А теперь пошлем ICMP PING на 10000 хостов
Перенесем «пинговалку» в vm на основе KVM
…
![Page 31: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/31.jpg)
Linux
Задержка пакета от входа до recvmsg() возросла в десятки раз (пики до 50ms!)
RCVBUF, кажется, достаточно большой для нескольких тысяч 28-байтных пакетов
Но входящие PONG не помещаются в RCVBUF при такой задержке
![Page 32: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/32.jpg)
Linux
Измеряем: gist.github.com/4454323
«Bookkeeping overhead» до ¾ kbyte / pkt
Накладные расходы в ≈27.5 раз выше описанных в man page
![Page 33: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/33.jpg)
Linux
ICMP PING — не очень интересен
Что происходит в UDP (VoIP, игры) сокетах?
Почему KVM настолько повышает latency?
![Page 34: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/34.jpg)
FreeBSD
rename()
vs.
FreeBSD-8.2
![Page 35: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/35.jpg)
FreeBSD
Сказ о rename() и о том, как скушать все PID'ы и уснуть в D-state
● В N потоков: rename(tmp, dest_dir)
● В M потоков: exists(dest_dir/fname)
● Порождать новый worker-поток, если старый не ответил за время T
![Page 36: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/36.jpg)
FreeBSD
В FreeBSD-9.0 VFS уже починили и этот deadlock в rename() исчез
Ответ: pool, queue & two strict ulimits
![Page 37: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все](https://reader033.vdocuments.pub/reader033/viewer/2022052522/54b618954a795996308b45fe/html5/thumbnails/37.jpg)
IT
Окончательный ответ на вопрос разработки, протекающих абстракций и всего такого:
Закон больших чисел
Взорвётся всё
Даже /dev/null. Я не шучу.