Upload
gleb-smirnoff
View
127
Download
0
Tags:
Embed Size (px)
Citation preview
Новая реализация 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