2013-01-05 01 Леонид Евдокимов. web scale. Взорвется все

38
Web Scale Взорвётся всё Леонид Евдокимов Второй омский IT-субботник, январь 2013, vk.com/omskit

Upload: -

Post on 14-Jan-2015

215 views

Category:

Documents


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

Web Scale

Взорвётся всё

Леонид Евдокимов

Второй омский IT-субботник, январь 2013, vk.com/omskit

Page 2: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

О чём

Juggler рост нагрузки с 1k до 10k машин

MongoDB о свойствах и особенностях

Python о доставке сигналов смеха для

MySQL о пользе суррогатных ключей

Linux об учете накладных расходов

FreeBSD о внезапной сложности простого

Page 3: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

Juggler

Система мониторинга событий

Внутри: MySQL, MongoDB, Python

В обвязке: nginx или lighttpd, flup или uWSGI

Подробнее: «Мониторинг со всех сторон»

YaC 2011, Алексей Симаков, clck.ru/L5GF

Page 4: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

MongoDB

NoSQL СУБД

Быстрая как /dev/null

Не использует JOIN

mongodb-is-webscale.com

Page 5: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

MongoDB

find({x:1})

vs.

update({x:1},

{$set:{pad:"A…A"}})

Page 6: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

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. Взорвется все

MongoDB

double-update ≈ ½ quad damage

> update(..., {$push: {big object}})

«Scaling with MongoDB»

by Michael Schurter 2011

Слушатель, доверяй, но проверяй!

Page 8: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

MongoDB

/usr/bin/mongod

vs.

/usr/sbin/logrotate

Page 9: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

MongoDB

jira/SERVER-3339 — при ротации логов…

… stackoverflow в обработчике SIGABRT

… deadlock в malloc()

Починка базы медленнее, чем MyISAM!

Page 10: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

MongoDB

jira/SERVER-3339 — при ротации логов…

… stackoverflow в обработчике SIGABRT

… deadlock в malloc()

Починка базы медленнее, чем MyISAM!

Ответ: db.runCommand("logRotate")

Page 11: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

Python

Однопоточный

«Медленный»

GIL

Page 12: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

Python

Однопоточный

«Медленный»

GIL

Ответ: multiprocessing

Page 13: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

Python

/usr/lib/python2.7/multiprocessing

vs.

/usr/sbin/logrotate

Page 14: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

Python

bugs/issue8296 — про multiprocessing

Происходит deadlock из-за EINTR и смерти одного из тредов

…ох уж эти сигналы!

Ответ: kill -9 -${sid}

:-)

Page 15: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

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. Взорвется все

MySQL

На этот раз не про сигналы

Page 17: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

MySQL

На этот раз не про сигналы

В mysql все сигналы обрабатываются в отдельном потоке

На этот раз — про JOIN

Page 18: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

MySQL

LEFT JOIN

vs.

RIGHT OUTER JOIN

Page 19: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

MySQL

LEFT JOIN

vs.

RIGHT OUTER JOIN

На самом деле - нет

Page 20: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

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. Взорвется все

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. Взорвется все

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. Взорвется все

MySQL

MEMORY maximum key length is 3072 bytes

MyISAM maximum key length is 1000 bytes

Page 24: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

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. Взорвется все

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. Взорвется все

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. Взорвется все

Linux & FreeBSD

Page 28: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

Linux

/bin/ping

vs.

setsockopt(fd, SO_RCVBUF, …)

Page 29: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

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. Взорвется все

Linux

А теперь пошлем ICMP PING на 10000 хостов

Перенесем «пинговалку» в vm на основе KVM

Page 31: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

Linux

Задержка пакета от входа до recvmsg() возросла в десятки раз (пики до 50ms!)

RCVBUF, кажется, достаточно большой для нескольких тысяч 28-байтных пакетов

Но входящие PONG не помещаются в RCVBUF при такой задержке

Page 32: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

Linux

Измеряем: gist.github.com/4454323

«Bookkeeping overhead» до ¾ kbyte / pkt

Накладные расходы в ≈27.5 раз выше описанных в man page

Page 33: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

Linux

ICMP PING — не очень интересен

Что происходит в UDP (VoIP, игры) сокетах?

Почему KVM настолько повышает latency?

Page 34: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

FreeBSD

rename()

vs.

FreeBSD-8.2

Page 35: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

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. Взорвется все

FreeBSD

В FreeBSD-9.0 VFS уже починили и этот deadlock в rename() исчез

Ответ: pool, queue & two strict ulimits

Page 37: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

IT

Окончательный ответ на вопрос разработки, протекающих абстракций и всего такого:

Закон больших чисел

Взорвётся всё

Даже /dev/null. Я не шучу.

Page 38: 2013-01-05 01 Леонид Евдокимов. Web scale. Взорвется все

Q & A

Леонид Евдокимов, разработчик ПО

[email protected] || http://darkk.net.ru

AKA @mathemonkey