Node.js HAProxy+NodeJS在TCP重传时卡住

Node.js HAProxy+NodeJS在TCP重传时卡住,node.js,tcp,haproxy,Node.js,Tcp,Haproxy,我有一个HAProxy+NodeJS+Rails设置,我使用NodeJS服务器进行文件上传 我面临的问题是,如果我通过haproxy上传到nodejs,并且由于数据包丢失而发生TCP快速重传,那么客户端上的发送速率将下降到零,持续约5-10秒,并被TCP重传淹没 如果我直接上传到NodeJS,这种情况就不会发生。TCP重传也会发生,但它不会被几十次重传尝试所困扰 我的测试设置是一个简单的HTML4表单方法POST,带有一个文件输入字段。 NodeJS服务器只读取传入的数据,而不执行其他操作 我已

我有一个HAProxy+NodeJS+Rails设置,我使用NodeJS服务器进行文件上传

我面临的问题是,如果我通过haproxy上传到nodejs,并且由于数据包丢失而发生TCP快速重传,那么客户端上的发送速率将下降到零,持续约5-10秒,并被TCP重传淹没

如果我直接上传到NodeJS,这种情况就不会发生。TCP重传也会发生,但它不会被几十次重传尝试所困扰

我的测试设置是一个简单的HTML4表单方法POST,带有一个文件输入字段。 NodeJS服务器只读取传入的数据,而不执行其他操作

我已经在多台机器、网络、浏览器上测试过了,但都是同一个问题

以下是上载文件时客户端的TCP流量转储:

.....
TCP 1506    [TCP segment of a reassembled PDU]
>> everything is uploading fine until:
TCP 1506    [TCP Fast Retransmission] [TCP segment of a reassembled PDU]
TCP 66      [TCP Dup ACK 7392#1] 63265 > http [ACK] Seq=4844161 Ack=1 Win=524280 Len=0 TSval=657047088 TSecr=79373730
TCP 1506    [TCP Retransmission] [TCP segment of a reassembled PDU]
>> the last message is repeated about 50 times for >>5-10 secs<< (TX drops to 0 on client, RX drops to 0 on server)
TCP 1506    [TCP segment of a reassembled PDU]
>> upload continues until the next TCP Fast Retransmission and the same thing happens again
谢谢你的阅读


Simon

尝试将超时http请求全局设置为6秒。它通常太低,无法拾取重新传输,虽然它无法解释原因,但可能会解决您的问题

尝试使用。我不确定它是否适合您的总体架构需求,但值得一试

global
    log 127.0.0.1   local1 debug
    maxconn     4096 # Total Max Connections. This is dependent on ulimit
    nbproc      2

defaults
    log global
    mode        http
    option      httplog
    option      tcplog

frontend http-in
    bind *:80

    timeout client 6000

    acl is_websocket   path_beg /node/

    use_backend node_backend  if is_websocket

    default_backend app_backend

# Rails Server (via nginx+passenger)
backend app_backend
    option httpclose
    option forwardfor

    timeout server 30000
    timeout connect 4000
    server app1 127.0.0.1:3000

# node.js
backend node_backend
    reqrep ^([^\ ]*)\ /node/(.*)     \1\ /\2
    option httpclose
    option forwardfor
    timeout queue 5000
    timeout server 6000
    timeout connect 5000
    server node1 127.0.0.1:3200 weight 1 maxconn 4096