+ All Categories
Home > Software > New sendfile (in Russian)

New sendfile (in Russian)

Date post: 04-Aug-2015
Category:
Upload: gleb-smirnoff
View: 123 times
Download: 0 times
Share this document with a friend
Popular Tags:
36
Новая реализация sendfile(2) Глеб Смирнов [email protected] ruBSD 2014 Яндекс Москва 13 декабря 2014 Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 1 / 23
Transcript

Новая реализация sendfile(2)

Глеб Смирнов[email protected]

ruBSD 2014ЯндексМосква

13 декабря 2014

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 1 / 23

История sendfile(2) До sendfile(2)

Трудная жизнь без sendfile(2)

while ((cnt = read(filefd, buf, (u_int)blksize)) > 0 &&write(netfd, buf, cnt) == cnt)

byte_count += cnt;

send_data() в src/libexec/ftpd/ftpd.c,FreeBSD 1.0, 1993 год

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 2 / 23

История sendfile(2) Рождение sendfile(2)

Рождение sendfile(2)

intsendfile(int fd, int s, off_t offset, size_t nbytes, .. );

1997 год: HP-UX 11.001998 год: FreeBSD 3.0 и Linux 2.2

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 3 / 23

История sendfile(2) sendfile(2) в FreeBSD

sendfile(2) в FreeBSD

Первая реализация - маппинг юзерленд цикла вядро:

read(filefd) → VOP_READ(vnode)write(netfd) → sosend(socket)blksize → PAGE_SIZE

Дальнейшие оптимизации:2004 год: флаг SF_NODISKIO

2006 год: вложенный цикл, обрабатывающийsbspace() байт2013 год: поддержка shared memory дескрипторов

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 4 / 23

История sendfile(2) sendfile(2) в FreeBSD

sendfile(2) в FreeBSD

Первая реализация - маппинг юзерленд цикла вядро:

read(filefd) → VOP_READ(vnode)write(netfd) → sosend(socket)blksize → PAGE_SIZE

Дальнейшие оптимизации:2004 год: флаг SF_NODISKIO

2006 год: вложенный цикл, обрабатывающийsbspace() байт2013 год: поддержка shared memory дескрипторов

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 4 / 23

История sendfile(2) sendfile(2) в FreeBSD

sendfile(2) в FreeBSD

Первая реализация - маппинг юзерленд цикла вядро:

read(filefd) → VOP_READ(vnode)write(netfd) → sosend(socket)blksize → PAGE_SIZE

Дальнейшие оптимизации:2004 год: флаг SF_NODISKIO2006 год: вложенный цикл, обрабатывающийsbspace() байт

2013 год: поддержка shared memory дескрипторов

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 4 / 23

История sendfile(2) sendfile(2) в FreeBSD

sendfile(2) в FreeBSD

Первая реализация - маппинг юзерленд цикла вядро:

read(filefd) → VOP_READ(vnode)write(netfd) → sosend(socket)blksize → PAGE_SIZE

Дальнейшие оптимизации:2004 год: флаг SF_NODISKIO2006 год: вложенный цикл, обрабатывающийsbspace() байт2013 год: поддержка shared memory дескрипторов

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 4 / 23

Чего не хватает sendfile(2) блокировка на I/O

Проблема #1: блокировка на I/O

Алгоритм работы современного HTTP-сервера:1 Получить очередной дескриптор из kevent(2)2 Выполнить write(2)/read(2)/sendfile(2) с ним3 Перейти к 1

Узкое место: время работы системного вызова.

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 5 / 23

Чего не хватает sendfile(2) блокировка на I/O

Проблема #1: блокировка на I/O

Алгоритм работы современного HTTP-сервера:1 Получить очередной дескриптор из kevent(2)2 Выполнить write(2)/read(2)/sendfile(2) с ним3 Перейти к 1

Узкое место: время работы системного вызова.

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 5 / 23

Чего не хватает sendfile(2) блокировка на I/O

Попытки решения проблемы #1

Отдельные контексты: процессы-потомки, тредыApachenginx 2

SF_NODISKIO + aio_read(2)nginxVarnish

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 6 / 23

Чего не хватает sendfile(2) блокировка на I/O

Попытки решения проблемы #1

Отдельные контексты: процессы-потомки, тредыApachenginx 2

SF_NODISKIO + aio_read(2)nginxVarnish

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 6 / 23

Чего не хватает sendfile(2) блокировка на I/O

Ещё попытки . . .

aio_mlock(2) вместо aio_read(2)aio_sendfile(2) ???

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 7 / 23

Чего не хватает sendfile(2) контроль над VM

Проблема #2: контроль над VM

VOP_READ() оставляет страницы в VM кэшеVOP_READ() [для UFS] осуществляет readahead

И запретить ему это делать не так просто!

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 8 / 23

Чего не хватает sendfile(2) контроль над VM

Проблема #2: контроль над VM

VOP_READ() оставляет страницы в VM кэшеVOP_READ() [для UFS] осуществляет readaheadИ запретить ему это делать не так просто!

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 8 / 23

Новый sendfile(2) реализация через pager

а что если VOP_GETPAGES()?

VOP_READ() → VOP_GETPAGES()

Плюсы:sendfile() уже работает постраничнокод для vnode и shmem становится общимконтроль над VM оказывается элементарной задачей

МинусТеряем эвристический readahead /

А им никто и не пользовался! ,

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 9 / 23

Новый sendfile(2) реализация через pager

а что если VOP_GETPAGES()?

VOP_READ() → VOP_GETPAGES()

Плюсы:sendfile() уже работает постраничнокод для vnode и shmem становится общимконтроль над VM оказывается элементарной задачей

МинусТеряем эвристический readahead /

А им никто и не пользовался! ,

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 9 / 23

Новый sendfile(2) реализация через pager

а что если VOP_GETPAGES()?

VOP_READ() → VOP_GETPAGES()

Плюсы:sendfile() уже работает постраничнокод для vnode и shmem становится общимконтроль над VM оказывается элементарной задачей

МинусТеряем эвристический readahead /А им никто и не пользовался! ,

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 9 / 23

Новый sendfile(2) VOP_GETPAGES_ASYNC()

VOP_GETPAGES_ASYNC()

intVOP_GETPAGES(struct vnode *vp, vm_page_t *ma,int count, int reqpage);

1 Инициализировать buf(9)2 buf->b_iodone = bdone;3 bstrategy(buf);4 bwait(buf); /* засыпает до окончания I/O */5 return;

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 10 / 23

Новый sendfile(2) VOP_GETPAGES_ASYNC()

VOP_GETPAGES_ASYNC()

intVOP_GETPAGES_ASYNC(struct vnode *vp,vm_page_t *ma, int count, int reqpage,vop_getpages_iodone_t *iodone, void *arg);

1 Инициализировать buf(9)2 buf->b_iodone = vnode_pager_async_iodone;3 bstrategy(buf);4 return;

vnode_pager_async_iodone вызывает iodone() .Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 10 / 23

Новый sendfile(2) неблокирующийся sendfile(2)

наивный неблокирующийся sendfile(2)

В kern_sendfile():1 nios++;2 VOP_GETPAGES_ASYNC(sendfile_iodone);

В sendfile_iodone():1 nios--;2 if (nios) return;3 sosend();

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 11 / 23

Новый sendfile(2) неблокирующийся sendfile(2)

проблема наивной реализации

sendfile(filefd, sockfd, ..);write(sockfd, ..);

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 12 / 23

Новый sendfile(2) “неготовые” данные в сокетах

буфер сокета

mbuf mbuf mbuf mbuf mbuf mbuf

struct sockbufstruct mbuf *sb_mb

struct mbuf *sb_mbtail

u_int sb_cc

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 13 / 23

Новый sendfile(2) “неготовые” данные в сокетах

буфер сокета с “неготовыми” данными

mbuf mbuf mbuf mbuf mbuf mbuf

page page

struct sockbufstruct mbuf *sb_mb

struct mbuf *sb_fnrdy

struct mbuf *sb_mbtail

u_int sb_acc

u_int sb_cccГлеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 14 / 23

Новый sendfile(2) конечная реализация

неблокирующийся sendfile(2)

В kern_sendfile():1 nios++;2 VOP_GETPAGES_ASYNC(sendfile_iodone);3 sosend(NOT_READY);

В sendfile_iodone():1 nios--;2 if (nios) return;3 soready();

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 15 / 23

Новый sendfile(2) сравнение со старым sendfile(2)

трафик

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 16 / 23

Новый sendfile(2) сравнение со старым sendfile(2)

CPU idle

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 17 / 23

Новый sendfile(2) сравнение со старым sendfile(2)

профилирование sendfile(2) в head

aio_daemon 13.64%sys_sendfile 7.40%t4_intr 5.66%xpt_done 1.04%pagedaemon 4.16%scheduler 5.28%

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 18 / 23

Новый sendfile(2) сравнение со старым sendfile(2)

профилирование нового sendfile(2)

sys_sendfile 16.9%t4_intr 8.17%xpt_done 9.91%pagedaemon 6.54%scheduler 3.58%

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 19 / 23

Новый sendfile(2) сравнение со старым sendfile(2)

профилирование нового sendfile(2)

sys_sendfile 16.9% (vm_page_grab 9.24% !!)t4_intr 8.17% (tcp_output() 2.07% !!)xpt_done 9.91% (m_freem() 3.11% !!)pagedaemon 6.54%scheduler 3.58%

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 19 / 23

Новый sendfile(2) сравнение со старым sendfile(2)

что же изменилось?

Новый код всегда отправляет полный сокетныйбуфер

Это хорошо для TCP (как протокола)Это трудно VM, аллокатору mbuf-ов,и ВНЕЗАПНО и TCP стеку

Будем чинить!

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 20 / 23

Новый sendfile(2) сравнение со старым sendfile(2)

что же изменилось?

Новый код всегда отправляет полный сокетныйбуфер

Это хорошо для TCP (как протокола)Это трудно VM, аллокатору mbuf-ов,и ВНЕЗАПНО и TCP стеку

Будем чинить!

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 20 / 23

Новый sendfile(2) сравнение со старым sendfile(2)

старый sendfile(2) @ Netflix

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 21 / 23

Новый sendfile(2) сравнение со старым sendfile(2)

новый sendfile(2) @ Netflix

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 21 / 23

Новый sendfile(2) проблемы и планы

что ещё предстоит сделать?

Проблемы:VM & I/O overcommitZFSSCTP

Планы:sendfile(2) осуществляющий TLS

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 22 / 23

Новый sendfile(2) проблемы и планы

что ещё предстоит сделать?

Проблемы:VM & I/O overcommitZFSSCTP

Планы:sendfile(2) осуществляющий TLS

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 22 / 23

Новый sendfile(2)

Вопросы?

Глеб Смирнов [email protected] Новая реализация sendfile(2) 13 декабря 2014 23 / 23


Recommended