Syscall накладные расходы

Насколько велики (приблизительно) издержки системного вызова ввода-вывода в Linux из C программа, я имею в виду, как плохо работает, например, много маленьких read / write операции по сравнению с read / write на больших буферах (на обычных файлах или сетевых сокетах)? Приложение сильно многопоточное.

2 ответа

Решение

Системные вызовы занимают по крайней мере 1-2 микросекунды на большинстве современных машин только для издержек системного вызова и гораздо больше времени, если они делают что-то сложное, что может блокировать или спать. Ожидайте не менее 20 микросекунд и порядка порядка миллисекунд для ввода-вывода. Сравните это с крошечным вызовом функции или макросом, который считывает байт из буфера пространства пользователя, который, вероятно, завершится за считанные наносекунды (может быть, 200 нс в плохой день).

Вы можете измерить это самостоятельно. Просто открой /dev/zero и немного читать и писать, измеряя время. Также варьируйте количество байтов, которые вы вводите в каждый вызов - например, 1 байт, 2 байта, 128 байт, .. 4096 байт. Также позаботьтесь об использовании read(2) а также write(2) системные вызовы и ничего, используя внутренние буферы.

Другие вопросы по тегам