Change kDefaultZeroCopyThreshold to 0 to avoid a regression and avoid a failure while...
authorDan Melnic <dmm@fb.com>
Thu, 2 Nov 2017 20:50:33 +0000 (13:50 -0700)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Thu, 2 Nov 2017 21:02:22 +0000 (14:02 -0700)
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
folly/io/async/test/ZeroCopyBenchmark.cpp

index 5687e6fa0b090411c70ce720380d50869e6ac12b..fb9d2c7f5983f64245681aca39a07424b6a48475 100644 (file)
@@ -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 {
index 7f397e00a0eaf9ea2a937e64dab8639b74be522d..6ef917ea9848068fee5ac55e14adae2706fce864 100644 (file)
@@ -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(