OnixS C++ Fenics UST BIMP Market Data Handler  1.1.0
API documentation
Low Latency Best Practices [UPDATED]

Given topic uncovers how to configure the Handler to achieve maximal performance characteristics and lowest processing latency.

Disable logging

Please use this code snippet to disable all logging operations:

// Disable logging
settings.logLevel = LogLevel::Disabled;

Turning Up Working Threads

Market data processing is done asynchronously by using working threads. Under normal conditions, threads may be executed on any processor available in the system. That may have a negative influence on overall performance due to unnecessary thread context switching.

To avoid switching threads between processors, Feed Engine as a manager of working threads, allows establishing processor affinity for each working thread:

FeedEngineSettings feSettings1;
FeedEngineSettings feSettings2;
// Scheduling Feed Engines to use different processors.
feSettings1.threadAffinity().insert(1);
feSettings2.threadAffinity().insert(2);

In addition to the ability to manipulate thread affinity for working threads of the Feed Engine, it also provides a set of events triggered by working threads at the beginning of processing and before ending processing loop. See Feed Engine Events for more information.

With the help of working threads events, it's possible to perform more advanced threads turning like updating thread priority:

struct ThreadPriorityManager : FeedEngineListener
{
void onFeedEngineThreadBegin(const FeedEngine&)
{
SetThreadPriority(
GetCurrentThread(),
THREAD_PRIORITY_TIME_CRITICAL);
}
};
FeedEngineSettings feSettings;
ThreadPriorityManager priorityManager;
FeedEngine feedEngine(feSettings, &priorityManager);

Decreasing Time Handler Spends on Waiting for Incoming Data

When the Handler accomplishes the processing of previously received market data, it initiates reception of new incoming data if it's available on the feed. In reality, data packets do not come each after another, but there's a certain time interval between two neighbor packets. Pauses between incoming packets cause Feed Engine bound to the Handler to suspend activities and sleep in the kernel while waiting for incoming data. As a result, data and execution code can be ejected from the processor's cache. That brings to the fact the next iteration of processing loop will be performed slower in comparison to the previous one. To influence the amount of time Feed Engine waits in the kernel on incoming data, it provides OnixS::FenicsUST::MarketData::Bimp::FeedEngineSettings::dataWaitTime parameter, whose value defines time Feed Engine spends in I/O operation while waiting for the incoming data. Reducing the value of the noted parameter increases the number of wake-ups and thus reduces the probability for Feed Engine to be thrown out of processor's cache. If the parameter is set to zero, Feed Engine checks for data available but does not enter kernel for a sleep. The drawback of reducing waiting time is an increase in processor consumption (up to 100% in the case of zero parameter value).