FIX Engine latency tuning guide
Latency tuning
FixEngine::createSession
Session persistent mode (ordered by latency: the best is on the top):
null_storageType
– should be chosen if session will not resend last sent messages by request and recovery on start will be performed by usertransient_storageType
– should be chosen if session will resend last sent messages by request and recovery on start will be performed by userpersistentMM_storageType
– should be chosen if session will resend last sent messages by request and recovery on start will be performed by FIX antennapersistent_storageType
– should be chosen if persistentMM_storageType is not supported by OS
Receiving
engine.properties
LogIncomingMessages = false
ThirdPartyRoutingIsEnabled = false
EnableIncrementalLogFileCreation = true
(for persistent mode)TimestampsInLogs = false
DictionariesFilesList
 – to get best latency user should create FIX protocol XML file with minimal message/field set. Only used fields should be listed in the message. Path to the XML file should be passed toDictionariesFilesList
parameter in the engine.properties.SessionExtraParameters::validation_.ignoreUnknownFields_
should be true.
SessionExtraParameters
SessionExtraParameters::validation_.isEnabled = false
SessionExtraParameters::validation_.ignoreUnknownFields_ = true
validateCheckSum_ = false;
More about validation parameters is here:Â How to configure FIX messages validationRecvCpuAffinity_
 – you can find the description of this parameter here: FIX Engine parameters#RecvCpuAffinitysocketPriority_ |= Engine::AGGRESSIVE_RECEIVE_SOCKET_OP_PRIORITY
aggressiveReceiveDelay_ = 0
; this will cause 100% core usage. For Linux see also:Â How to use SO_BUSY_POLL socket option
Sending
engine.properties
CheckVersionOfOutgoingMessages = false
TimestampsInLogs = false
EnableIncrementalLogFileCreation = true
(for persistent mode)DictionariesFilesList
 – to get best latency user should create FIX protocol XML file with minimal message/field set. Only used fields should be listed in the message. Path to the XML file should be passed toDictionariesFilesList
parameter in the engine.properties.SessionExtraParameters::validation_.ignoreUnknownFields_
should be true.
SessionExtraParameters
SessionExtraParameters::validation_.isEnabled = false
SessionExtraParameters::validation_.ignoreUnknownFields_ = true
generateCheckSum_ = false
; if remote side does not validate CheckSum(10) field, user can disable calculation of this fieldSendCpuAffinity_
 – you can find the description of this parameter here: FIX Engine parameters#SendCpuAffinitydisableTCPBuffer_ = true
socketPriority_ |= Engine::AGGRESSIVE_SEND_SOCKET_OP_PRIORITY
Session::put
PutOptions.overrideSendingTime_ = false
; With this option user should get current system time only once and copy obtained value to SendingTime and TransactTime (if defined) fieldPreparedMessage
– where it is possible user should use this class instead of FIXMessage- If
PreparedMessage
is not suitable, you should reuse sent FIXMessge objects