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

Post on 14-Jan-2015

215 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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. Я не шучу.

Q & A

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

leon@darkk.net.ru || http://darkk.net.ru

AKA @mathemonkey

top related