diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-11-29 12:13:18 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2020-11-29 21:32:15 +0000 |
commit | 12275ab8fb1f83935ba2a4ab2f7a72bd262cbcf3 (patch) | |
tree | e65bf1a2f91fdda8b4478addc189c2ef836dd261 /fnet/src | |
parent | 34d64875c38d2a8049a70f0bdf9d7fcc3ce16ef8 (diff) |
Allow to optimize for throughput over latency. Wakeup is extremely expensive.
Diffstat (limited to 'fnet/src')
-rw-r--r-- | fnet/src/vespa/fnet/transport.cpp | 3 | ||||
-rw-r--r-- | fnet/src/vespa/fnet/transport.h | 6 | ||||
-rw-r--r-- | fnet/src/vespa/fnet/transport_thread.cpp | 5 |
3 files changed, 12 insertions, 2 deletions
diff --git a/fnet/src/vespa/fnet/transport.cpp b/fnet/src/vespa/fnet/transport.cpp index 8543d648400..445eed20ce4 100644 --- a/fnet/src/vespa/fnet/transport.cpp +++ b/fnet/src/vespa/fnet/transport.cpp @@ -29,7 +29,8 @@ FNET_Transport::FNET_Transport(vespalib::AsyncResolver::SP resolver, vespalib::C : _async_resolver(std::move(resolver)), _crypto_engine(std::move(crypto)), _work_pool(std::make_unique<vespalib::ThreadStackExecutor>(1, 128 * 1024, fnet_work_pool, 1024)), - _threads() + _threads(), + _optimizeFor(vespalib::Executor::OptimizeFor::LATENCY) { assert(num_threads >= 1); for (size_t i = 0; i < num_threads; ++i) { diff --git a/fnet/src/vespa/fnet/transport.h b/fnet/src/vespa/fnet/transport.h index 29f1fb2144f..45a2122c9c9 100644 --- a/fnet/src/vespa/fnet/transport.h +++ b/fnet/src/vespa/fnet/transport.h @@ -31,6 +31,7 @@ private: vespalib::CryptoEngine::SP _crypto_engine; std::unique_ptr<vespalib::SyncableThreadExecutor> _work_pool; Threads _threads; + vespalib::Executor::OptimizeFor _optimizeFor; public: /** @@ -52,6 +53,11 @@ public: : FNET_Transport(vespalib::AsyncResolver::get_shared(), vespalib::CryptoEngine::get_default(), 1) {} ~FNET_Transport(); + vespalib::Executor::OptimizeFor optimizeFor() const { return _optimizeFor; } + void optimizeFor(vespalib::Executor::OptimizeFor optimizeFor_in) { + _optimizeFor = optimizeFor_in; + } + /** * Try to execute the given task on the internal work pool * executor (post). If the executor has been closed or there is diff --git a/fnet/src/vespa/fnet/transport_thread.cpp b/fnet/src/vespa/fnet/transport_thread.cpp index ba9c4bb7789..2064554392c 100644 --- a/fnet/src/vespa/fnet/transport_thread.cpp +++ b/fnet/src/vespa/fnet/transport_thread.cpp @@ -121,7 +121,7 @@ FNET_TransportThread::PostEvent(FNET_ControlPacket *cpacket, SafeDiscardEvent(cpacket, context); return false; } - wasEmpty = _queue.IsEmpty_NoLock(); + wasEmpty = _queue.IsEmpty_NoLock() && _owner.optimizeFor() == vespalib::Executor::OptimizeFor::LATENCY; _queue.QueuePacket_NoLock(cpacket, context); } if (wasEmpty) { @@ -482,6 +482,9 @@ FNET_TransportThread::EventLoopIteration() // handle wakeup and io-events _selector.dispatch(*this); + if (owner().optimizeFor() != vespalib::Executor::OptimizeFor::LATENCY) { + handle_wakeup(); + } // handle IOC time-outs if (_config._iocTimeOut > 0) { |