aboutsummaryrefslogtreecommitdiffstats
path: root/fnet
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-11-29 12:13:18 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2020-11-29 21:32:15 +0000
commit12275ab8fb1f83935ba2a4ab2f7a72bd262cbcf3 (patch)
treee65bf1a2f91fdda8b4478addc189c2ef836dd261 /fnet
parent34d64875c38d2a8049a70f0bdf9d7fcc3ce16ef8 (diff)
Allow to optimize for throughput over latency. Wakeup is extremely expensive.
Diffstat (limited to 'fnet')
-rw-r--r--fnet/src/vespa/fnet/transport.cpp3
-rw-r--r--fnet/src/vespa/fnet/transport.h6
-rw-r--r--fnet/src/vespa/fnet/transport_thread.cpp5
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) {