Com relação aos ajustáveis do kernel para latência, um se destaca:
echo 1 > /proc/sys/net/ipv4/tcp_low_latency
A partir da documentação :
If set, the TCP stack makes decisions that prefer lower latency as opposed to higher throughput. By default, this option is not set meaning that higher throughput is preferred. An example of an application where this default should be changed would be a Beowulf compute cluster. Default: 0
Você também pode desativar o algoritmo de Nagle em seu aplicativo (que armazenará em buffer a saída TCP até o tamanho máximo do segmento) com algo como:
#include <sys/types.h>
#include <stdio.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <linux/tcp.h>
int optval = 1;
int mysock;
void main() {
void errmsg(char *msg) {perror(msg);exit(1);}
if((mysock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
errmsg("setsock failed");
}
if((setsockopt(mysock, SOL_SOCKET, TCP_NODELAY, &optval, sizeof(optval))) < 0) {
errmsg("setsock failed");
}
/* Some more code here ... */
close(mysock);
}
O "oposto" desta opção é TCP_CORK
, que irá "re-Nagle" pacotes. Cuidado, no entanto, como TCP_NODELAY
nem sempre pode fazer o que você espera e, em alguns casos, pode prejudicar o desempenho. Por exemplo, se você estiver enviando dados em massa, você desejará maximizar o throughput por pacote, portanto, defina TCP_CORK
. Se você tiver um aplicativo que requer interatividade imediata (ou onde a resposta é muito maior que a solicitação, negando a sobrecarga), use TCP _NODELAY
. Em outra nota, este comportamento é específico do Linux e o BSD provavelmente é diferente, então administrador de condições .
Certifique-se de fazer um teste completo com seu aplicativo e sua infraestrutura.