The ef_vi API is a layer 2 API that grants an application direct access to the Solarflare network adapter datapath to deliver lower latency and reduced per message processing overheads. ef_vi is the internal API used by Onload for sending and receiving packets. It can be used directly by applications that want the very lowest latency send and receive API and that do not require a POSIX socket interface.
Multithreading
By default, the handler uses a single dedicated thread for its operation. However, if multiple handlers are needed, the number of threads will equal the number of handlers, which may degrade performance. To address this, OnixS::B3::MarketData::UMDF::FeedEngineThreadPool is provided.
EfViFeedEngine feedEngine;
FeedEngineThreadPoolSettings feedEngineThreadPoolSettings;
feedEngineThreadPoolSettings.threadCount(THREAD_COUNT);
FeedEngineThreadPool pool(feedEngineThreadPoolSettings, &feedEngine);
handlerSettings1.feedEngine = &feedEngine;
handlerSettings2.feedEngine = &feedEngine;
auto handler1 = make_shared<Handler>(handlerSettings1);
auto handler2 = make_shared<Handler>(handlerSettings1);
handler1->start();
handler2->start();
handler1->stop(true);
handler2->stop(true);
- See also
-
Single Thread
To minimize the number of threads, the same thread can be used for both creating the handler instance and processing market data.
SingleThreadedEfViFeedEngine feedEngine(feLoggerSettings, NETWORK_INTEFACE);
handlerSettings1.feedEngine = &feedEngine;
handlerSettings2.feedEngine = &feedEngine;
auto handler1 = make_shared<Handler>(handlerSettings1);
auto handler2 = make_shared<Handler>(handlerSettings1);
handler1->start();
handler2->start();
while (true)
{
process(feedEngine);
}
handler1->stop(true);
handler1->stop(true);
- See also
-
Feed Engine for a Feed
If a different network interface is used for incremental packets, a separate instance of OnixS::B3::MarketData::UMDF::SingleThreadedEfViFeedEngine can be used for the corresponding feed.
SingleThreadedEfViFeedEngine feedEngine(feLoggerSettings, NETWORK_INTEFACE);
SingleThreadedEfViFeedEngine feedEngineForIncrementalA(feLoggerSettings, NETWORK_INTEFACE_FOR_INCREMENTAL_A);
handlerSettings.feedEngine = &feedEngine;
handlerSettings.incrementalFeeds.a.feedEngine = &feedEngineForIncrementalA;
auto handler = make_shared<Handler>(handlerSettings);
handler->start();
while (true)
{
process(feedEngine, feedEngineForIncrementalA);
}
handler->stop(true);