Курс высокие нагрузки: сеть (отрывок)

20,888 views
22,149 views

Published on

Разработка надёжных высоконагруженных систем
Москва, 24, 25 и 26 мая

http://smira.highload.ru/

Трехдневный мастер-класс с практическими заданиями

Published in: Education

Курс высокие нагрузки: сеть (отрывок)

  1. 1. © Copyright 2014 Andrey Smirnov Сетевой ввод-вывод • Блокирующийся • Неблокирующийся • Асинхронный
  2. 2. © Copyright 2014 Andrey Smirnov UNIX (POSIX) • fd - файловый дескриптор • socket() • listen()/accept() • read(fd, buf) • write(fd, buf) • close(fd)
  3. 3. © Copyright 2014 Andrey Smirnov Внутренности Драйвер TCP/IP стек Протокол HTTP запрос/ ответ kernel user-space
  4. 4. © Copyright 2014 Andrey Smirnov Блокирующийся 
 ввод-вывод • accept(fd) - заблокируется, пока не будет нового входящего соединения • read(fd, buf) - заблокируется, пока не прибудут данные в сокет • write(fd, buf) - заблокируется, пока не освободится место в буфере TCP
  5. 5. © Copyright 2014 Andrey Smirnov Неблокирующийся 
 ввод-вывод • Любая операция завершается немедленно • Вместо того, чтобы заблокироваться, вызов возвращает EAGAIN/EWOULDBLOCK
  6. 6. © Copyright 2014 Andrey Smirnov Опрос готовности • Нотификации: • level-triggered (состояние) • edge-triggered (изменение состояния) • Механизмы: • select(), poll() • epoll(), kqueue()
  7. 7. © Copyright 2014 Andrey Smirnov Неблокирующий
 ввод-вывод • select(fds, timeout) ⇛ ready to read/write • do read/write until EAGAIN
  8. 8. © Copyright 2014 Andrey Smirnov Ядерный сервер • kHTTPd • http.sys
  9. 9. © Copyright 2014 Andrey Smirnov Сеть в User-space • Snab Switch • netmap
  10. 10. © Copyright 2014 Andrey Smirnov Реактор • Design Pattern • “Дай мне кучу сокетов, а я сделаю callback, когда они будут готовы” • Таймер: “Вызови меня через X мс”
  11. 11. © Copyright 2014 Andrey Smirnov Что внутри • Отсортированный по времени срабатывания список таймеров + callback • Список файловых дескрипторов для ожидания готовности + callback • select(fds, min(timer)) ⇛ callbacks
  12. 12. © Copyright 2014 Andrey Smirnov Многозадачность • Процесс • Нить • Кооперативная • Явная • Корутины • Комбинированные варианты
  13. 13. © Copyright 2014 Andrey Smirnov Процессы • Исторически первый тип многозадачности • Полная изоляция* • Видимость для планировщика ОС • Сложность коммуникации
  14. 14. © Copyright 2014 Andrey Smirnov fork() code r/o data heap code r/o data heap
  15. 15. © Copyright 2014 Andrey Smirnov fork() • Копирование файловых дескрипторов • Копирование mmap()-областей • …
  16. 16. © Copyright 2014 Andrey Smirnov Сервер на процессах • Родитель делает listen() • Родитель делает fork() • Потомки делают accept() и обслуживают соединения
  17. 17. © Copyright 2014 Andrey Smirnov Примеры • Apache: mod_prefork • FastCGI • PostgreSQL: • SysV IPC: shm, sem
  18. 18. © Copyright 2014 Andrey Smirnov Плюсы и минусы • Простота* реализации • Ресурсоемкость • Возможность использования всех ядер процессоров • Сложность обмена информацией • Падение одного процесса не влияет на другие
  19. 19. © Copyright 2014 Andrey Smirnov Нити (ОС) • Видны планировщику • Имеют отдельный стек и TLS • Более легковесные, чем процесс • Отсутствует изоляция • Сложность написания корректных программ
  20. 20. © Copyright 2014 Andrey Smirnov Синхронизация • Любой доступ к общим данным должен быть синхронизирован • Атомарные операции (без синхронизации)
  21. 21. © Copyright 2014 Andrey Smirnov Блокировки • acquire(x.lock) • x.field++ • release(x.lock)
  22. 22. © Copyright 2014 Andrey Smirnov Deadlock • acquire(A) • acquire(B) • … • acquire(B) • acquire(A) • … Thread 1 Thread 2
  23. 23. © Copyright 2014 Andrey Smirnov Deadlock
  24. 24. ? © Copyright 2014 Andrey Smirnov Как избежать deadlock?
  25. 25. © Copyright 2014 Andrey Smirnov Механизмы синхронизации • mutex • semaphore • rwlock • spinlock • condition variable • …
  26. 26. © Copyright 2014 Andrey Smirnov GIL • Один mutex на все состояние • Простой и надежный вариант • Низкая конкурентность исполнения
  27. 27. © Copyright 2014 Andrey Smirnov Worker
  28. 28. © Copyright 2014 Andrey Smirnov Event Loop
  29. 29. © Copyright 2014 Andrey Smirnov Примеры • MySQL • Apache: mpm_worker
  30. 30. © Copyright 2014 Andrey Smirnov Кооперативная многозадачность • “Невидима” для ОС, один процесс (нить) • “Поток” добровольно передает управление другому • Явная: callbackи • Неявная: green threads
  31. 31. © Copyright 2014 Andrey Smirnov Истоки • Эффективное использование ресурсов ВС • Пакетный режим исполнения задач • Многопользовательские системы • Планировщик интерактивных систем
  32. 32. © Copyright 2014 Andrey Smirnov Сегодня • Один сервер - один вариант использования • Сервер - не многопользовательская система • Использование процессора минимально • Обслуживание большого числа соединений (C10k, C100k)
  33. 33. © Copyright 2014 Andrey Smirnov JavaScript • Явная кооперативная многозадачность • Выполнение - в один поток • XMLHTTPRequest ⇛ callback • Таймеры ⇛ callback
  34. 34. © Copyright 2014 Andrey Smirnov Python/Twisted • Одна из первых реализаций кооперативной многозадачности с неблокирующим вводом- выводом • Большое количество протоколов, драйверов • Влияние на другие реализации • Четкие и ясные примитивы
  35. 35. © Copyright 2014 Andrey Smirnov Deferred • Отложенный результат • “Я не могу дать результат сейчас, но я его помещу в Deferred, как только он будет доступен” • 100 строк кода*
  36. 36. © Copyright 2014 Andrey Smirnov Deferred
  37. 37. © Copyright 2014 Andrey Smirnov Deferred
  38. 38. © Copyright 2014 Andrey Smirnov Влияние • jQuery: Deferred • Ruby: EventMachine • Python 3: AsyncIO • C#: Task/async/await
  39. 39. © Copyright 2014 Andrey Smirnov Green threads • Любая блокирующая операция приводит к переключению • Код выглядит последовательно • Многозадачность на основе “согласия”
  40. 40. © Copyright 2014 Andrey Smirnov gevent def print_head(url):! print('Starting %s' % url)! data = urlopen(url).read()! print('%s: %s bytes: %r' % (url, len(data), data[:50]))! ! jobs = [gevent.spawn(print_head, url) for url in urls]! ! gevent.wait(jobs)!
  41. 41. © Copyright 2014 Andrey Smirnov Примеры • Python: gevent, eventlet, … • Ruby (<1.9) • Lua • Go* • Erlang*
  42. 42. © Copyright 2014 Andrey Smirnov Комбинированные • 1:1 • N:1 • M:N
  43. 43. © Copyright 2014 Andrey Smirnov Разработка  надежных   высоконагруженных  систем • 24,  25  и  26-­‐го  мая,  Москва   • h4p://smira.highload.ru/   • Мастер-­‐класс  с  практическими  заданиями

×