From 6b8138f935ed461e8e1e3c6c675539df1be5a211 Mon Sep 17 00:00:00 2001 From: Dan Melnic Date: Thu, 2 Nov 2017 13:50:33 -0700 Subject: [PATCH] Change kDefaultZeroCopyThreshold to 0 to avoid a regression and avoid a failure while running as not root Summary: Change kDefaultZeroCopyThreshold to 0 to avoid a regression when using a buffer chain that exceeds 32K but each buffer is small. Change the benchmark to set it's own threshold. Also use calloc vs malloc (in the benchmark only) to get around some weird kernel interaction on non zero copy enabled systems - 2 back to back tests report very different results. Reviewed By: djwatson Differential Revision: D6112299 fbshipit-source-id: 3895d3ece2925c4626284ff364495708293edc3e --- folly/io/async/AsyncSocket.h | 2 +- folly/io/async/test/ZeroCopyBenchmark.cpp | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/folly/io/async/AsyncSocket.h b/folly/io/async/AsyncSocket.h index 5687e6fa..fb9d2c7f 100644 --- a/folly/io/async/AsyncSocket.h +++ b/folly/io/async/AsyncSocket.h @@ -504,7 +504,7 @@ class AsyncSocket : virtual public AsyncTransportWrapper { void setReadCB(ReadCallback* callback) override; ReadCallback* getReadCallback() const override; - static const size_t kDefaultZeroCopyThreshold = 32768; // 32KB + static const size_t kDefaultZeroCopyThreshold = 0; bool setZeroCopy(bool enable); bool getZeroCopy() const { diff --git a/folly/io/async/test/ZeroCopyBenchmark.cpp b/folly/io/async/test/ZeroCopyBenchmark.cpp index 7f397e00..6ef917ea 100644 --- a/folly/io/async/test/ZeroCopyBenchmark.cpp +++ b/folly/io/async/test/ZeroCopyBenchmark.cpp @@ -27,6 +27,8 @@ using namespace folly; +static constexpr auto const kZeroCopyThreshold = 4096; + class TestAsyncSocket { public: explicit TestAsyncSocket( @@ -77,6 +79,9 @@ class TestAsyncSocket { zeroCopy_ = enable; if (sock_) { sock_->setZeroCopy(zeroCopy_); + if (zeroCopy_) { + sock_->setZeroCopyWriteChainThreshold(kZeroCopyThreshold); + } } } @@ -162,8 +167,12 @@ class TestAsyncSocket { } bool writeBuffer() { + // use calloc to make sure the memory is touched + // if the memory is just malloc'd, running the zeroCopyOn + // and the zeroCopyOff back to back on a system that does not support + // zerocopy leads to the second test being much slower writeBuffer_ = - folly::IOBuf::takeOwnership(::malloc(bufferSize_), bufferSize_); + folly::IOBuf::takeOwnership(::calloc(1, bufferSize_), bufferSize_); if (sock_ && writeBuffer_) { sock_->writeChain( -- 2.34.1