В исходной реализации vmsplice()
было предложено, чтобы, если у вас был буфер пользователя на уровне пользователя 2x максимальное количество страниц, которые могли бы вставляется в трубу, удаленная vmsplice() во второй половине буфера гарантирует, что ядро было выполнено с использованием первой половины буфера.
Но в конце концов это было не так, и особенно для TCP, страницы ядра сохранялись до получения ACK с другой стороны. Исправление этого было оставлено как будущая работа, и, следовательно, для TCP, ядру все равно пришлось бы копировать страницы из канала.
vmsplice()
имеет параметр SPLICE_F_GIFT
, который имеет отношение к этому, но проблема в том, что в этом есть две другие проблемы - как эффективно получать свежие страницы из ядра и как уменьшить кеш-хаус. Первая проблема заключается в том, что mmap требует, чтобы ядро очистило страницы, а вторая проблема заключается в том, что хотя mmap может использовать функцию fa kscrubd в ядре, что увеличивает рабочий набор процесса (кэширование).
Исходя из этого, у меня есть следующие вопросы:
- Каково текущее состояние уведомления пользователей о безопасном повторном использовании страниц? Меня особенно интересуют страницы splice() d на сокет (TCP). Что-нибудь случилось за последние 5 лет?
- Является ли
mmap
/vmsplice
/splice
/munmap
текущей лучшей практикой для нулевого копирования на сервере TCP или у нас есть лучшие варианты сегодня?