From ebbd26eeea4115c946d1254d94acd50f150b4455 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20H=C3=B6gberg?= Date: Fri, 3 Nov 2017 11:49:27 +0100 Subject: Reimplement efile_drv as a dirty NIF This improves the latency of file operations as dirty schedulers are a bit more eager to run jobs than async threads, and use a single global queue rather than per-thread queues, eliminating the risk of a job stalling behind a long-running job on the same thread while other async threads sit idle. There's no such thing as a free lunch though; the lowered latency comes at the cost of increased busy-waiting which may have an adverse effect on some applications. This behavior can be tweaked with the +sbwt flag, but unfortunately it affects all types of schedulers and not just dirty ones. We plan to add type-specific flags at a later stage. sendfile has been moved to inet_drv to lessen the effect of a nasty race; the cooperation between inet_drv and efile has never been airtight and the socket dying at the wrong time (Regardless of reason) could result in fd aliasing. Moving it to the inet driver makes it impossible to trigger this by closing the socket in the middle of a sendfile operation, while still allowing it to be aborted -- something that can't be done if it stays in the file driver. The race still occurs if the controlling process dies in the short window between dispatching the sendfile operation and the dup(2) call in the driver, but it's much less likely to happen now. A proper fix is in the works. -- Notable functional differences: * The use_threads option for file:sendfile/5 no longer has any effect. * The file-specific DTrace probes have been removed. The same effect can be achieved with normal tracing together with the nif__entry/nif__return probes to track scheduling. -- OTP-14256 --- bootstrap/bin/no_dot_erlang.boot | Bin 5607 -> 5905 bytes bootstrap/bin/start.boot | Bin 5607 -> 5905 bytes bootstrap/bin/start_clean.boot | Bin 5607 -> 5905 bytes bootstrap/lib/kernel/ebin/file.beam | Bin 14080 -> 14052 bytes bootstrap/lib/kernel/ebin/file_io_server.beam | Bin 15040 -> 15412 bytes bootstrap/lib/kernel/ebin/file_server.beam | Bin 5348 -> 5104 bytes bootstrap/lib/kernel/ebin/kernel.app | 7 +++++++ bootstrap/lib/kernel/ebin/raw_file_io.beam | Bin 0 -> 1724 bytes .../lib/kernel/ebin/raw_file_io_compressed.beam | Bin 0 -> 2364 bytes bootstrap/lib/kernel/ebin/raw_file_io_deflate.beam | Bin 0 -> 2708 bytes bootstrap/lib/kernel/ebin/raw_file_io_delayed.beam | Bin 0 -> 5432 bytes bootstrap/lib/kernel/ebin/raw_file_io_inflate.beam | Bin 0 -> 4256 bytes bootstrap/lib/kernel/ebin/raw_file_io_list.beam | Bin 0 -> 2576 bytes bootstrap/lib/kernel/ebin/raw_file_io_raw.beam | Bin 0 -> 396 bytes 14 files changed, 7 insertions(+) create mode 100644 bootstrap/lib/kernel/ebin/raw_file_io.beam create mode 100644 bootstrap/lib/kernel/ebin/raw_file_io_compressed.beam create mode 100644 bootstrap/lib/kernel/ebin/raw_file_io_deflate.beam create mode 100644 bootstrap/lib/kernel/ebin/raw_file_io_delayed.beam create mode 100644 bootstrap/lib/kernel/ebin/raw_file_io_inflate.beam create mode 100644 bootstrap/lib/kernel/ebin/raw_file_io_list.beam create mode 100644 bootstrap/lib/kernel/ebin/raw_file_io_raw.beam (limited to 'bootstrap') diff --git a/bootstrap/bin/no_dot_erlang.boot b/bootstrap/bin/no_dot_erlang.boot index a49298d260..2b909efb58 100644 Binary files a/bootstrap/bin/no_dot_erlang.boot and b/bootstrap/bin/no_dot_erlang.boot differ diff --git a/bootstrap/bin/start.boot b/bootstrap/bin/start.boot index a49298d260..2b909efb58 100644 Binary files a/bootstrap/bin/start.boot and b/bootstrap/bin/start.boot differ diff --git a/bootstrap/bin/start_clean.boot b/bootstrap/bin/start_clean.boot index a49298d260..2b909efb58 100644 Binary files a/bootstrap/bin/start_clean.boot and b/bootstrap/bin/start_clean.boot differ diff --git a/bootstrap/lib/kernel/ebin/file.beam b/bootstrap/lib/kernel/ebin/file.beam index 6d45887800..6afd377023 100644 Binary files a/bootstrap/lib/kernel/ebin/file.beam and b/bootstrap/lib/kernel/ebin/file.beam differ diff --git a/bootstrap/lib/kernel/ebin/file_io_server.beam b/bootstrap/lib/kernel/ebin/file_io_server.beam index 74a62d6388..4d13d35d76 100644 Binary files a/bootstrap/lib/kernel/ebin/file_io_server.beam and b/bootstrap/lib/kernel/ebin/file_io_server.beam differ diff --git a/bootstrap/lib/kernel/ebin/file_server.beam b/bootstrap/lib/kernel/ebin/file_server.beam index d609725fa8..f17b888898 100644 Binary files a/bootstrap/lib/kernel/ebin/file_server.beam and b/bootstrap/lib/kernel/ebin/file_server.beam differ diff --git a/bootstrap/lib/kernel/ebin/kernel.app b/bootstrap/lib/kernel/ebin/kernel.app index 68dcf6b930..55445f83c6 100644 --- a/bootstrap/lib/kernel/ebin/kernel.app +++ b/bootstrap/lib/kernel/ebin/kernel.app @@ -88,6 +88,13 @@ inet_udp, inet_sctp, pg2, + raw_file_io, + raw_file_io_compressed, + raw_file_io_deflate, + raw_file_io_delayed, + raw_file_io_inflate, + raw_file_io_list, + raw_file_io_raw, seq_trace, standard_error, wrap_log_reader]}, diff --git a/bootstrap/lib/kernel/ebin/raw_file_io.beam b/bootstrap/lib/kernel/ebin/raw_file_io.beam new file mode 100644 index 0000000000..734a051882 Binary files /dev/null and b/bootstrap/lib/kernel/ebin/raw_file_io.beam differ diff --git a/bootstrap/lib/kernel/ebin/raw_file_io_compressed.beam b/bootstrap/lib/kernel/ebin/raw_file_io_compressed.beam new file mode 100644 index 0000000000..caa3d9ac6b Binary files /dev/null and b/bootstrap/lib/kernel/ebin/raw_file_io_compressed.beam differ diff --git a/bootstrap/lib/kernel/ebin/raw_file_io_deflate.beam b/bootstrap/lib/kernel/ebin/raw_file_io_deflate.beam new file mode 100644 index 0000000000..eb487b1fb0 Binary files /dev/null and b/bootstrap/lib/kernel/ebin/raw_file_io_deflate.beam differ diff --git a/bootstrap/lib/kernel/ebin/raw_file_io_delayed.beam b/bootstrap/lib/kernel/ebin/raw_file_io_delayed.beam new file mode 100644 index 0000000000..45b9586251 Binary files /dev/null and b/bootstrap/lib/kernel/ebin/raw_file_io_delayed.beam differ diff --git a/bootstrap/lib/kernel/ebin/raw_file_io_inflate.beam b/bootstrap/lib/kernel/ebin/raw_file_io_inflate.beam new file mode 100644 index 0000000000..f348054060 Binary files /dev/null and b/bootstrap/lib/kernel/ebin/raw_file_io_inflate.beam differ diff --git a/bootstrap/lib/kernel/ebin/raw_file_io_list.beam b/bootstrap/lib/kernel/ebin/raw_file_io_list.beam new file mode 100644 index 0000000000..283f3b892d Binary files /dev/null and b/bootstrap/lib/kernel/ebin/raw_file_io_list.beam differ diff --git a/bootstrap/lib/kernel/ebin/raw_file_io_raw.beam b/bootstrap/lib/kernel/ebin/raw_file_io_raw.beam new file mode 100644 index 0000000000..b47a67055d Binary files /dev/null and b/bootstrap/lib/kernel/ebin/raw_file_io_raw.beam differ -- cgit v1.2.3