Re: bin/60443: ftp ASCII transfers are too slow

"RVP via gnats" <[email protected]>
Newsgroups gmane.os.netbsd.bugs
Message-ID <[email protected]>
The following reply was made to PR bin/60443; it has been noted by GNATS.

From: RVP <[email protected]>
To: [email protected]
Cc: 
Subject: Re: bin/60443: ftp ASCII transfers are too slow
Date: Mon, 13 Jul 2026 01:36:03 +0000 (UTC)

 On Sun, 12 Jul 2026, Michael van Elst via gnats wrote:
 
 > [email protected] ("[email protected] via gnats") writes:
 >
 > >FTP ASCII transfers seem to interact badly with Nagle's algorithm
 > >because ASCII xfers rely on libc's BUFSIZ (1KB) internal buffer.
 >
 > I doubt that Nagle's algorithm has any effect here. After all,
 > it would just improve throughput at the cost of latency.
 >
 > What you see is the higher overhead from stdio.
 >
 
 
 Right, of course stdio plays a part, but because, I think, of the 1KB at-a-time
 writes. And, I reached for an interaction with Nagle because:
 
 a) 200ms packet delay (see tcpdump log below).
 
 b) situation improved if I used a 4KB stdio buffer.
 
 c) things also zip along if I set TCP_NODELAY on the xfer sockets (see log).
 
 > ftp> get in.txt
 > local: in.txt remote: in.txt
 > 229 Entering Extended Passive Mode (|||62337|)
 > 150 Opening ASCII mode data connection for 'in.txt' (306788817 bytes).
 > 226 Transfer complete.
 > 312122680 bytes received in 00:08 (34.99 MiB/s)
 > [...]
 > In all cases the ftpd was CPU limited (on a 1.6GHz Atom N3150).
 >
 
 I get better speeds with both my patches on an
 
  	"Intel(R) Core(TM) i3-1005G1 CPU @ 1.20GHz"
 
 Otherwise, with a large enough file, ASCII xfers eventually just crawls--like
 settling on ~70KB/sec xfer rates.
 
 I don't know how you're getting 35MB/sec w/o any tweaking. Michael, can you try
 with both server and client on localhost like I did?
 
 -RVP
 
 ---START tcpdump output---
 04:42:56.720934 IP6 ::1.65426 > ::1.21: Flags [S], seq 62646337, win 32768, options [mss 33564,nop,wscale 3,sackOK,TS val 1 ecr 0], length 0
 04:42:56.720954 IP6 ::1.21 > ::1.65426: Flags [S.], seq 59295266, ack 62646338, win 32768, options [mss 33564,nop,wscale 3,sackOK,TS val 1 ecr 1], length 0
 04:42:56.720965 IP6 ::1.65426 > ::1.21: Flags [.], ack 1, win 4096, options [nop,nop,TS val 1 ecr 1], length 0
 04:42:56.726401 IP6 ::1.21 > ::1.65426: Flags [P.], seq 1:57, ack 1, win 4096, options [nop,nop,TS val 1 ecr 1], length 56: FTP: 220 localhost FTP server (NetBSD-ftpd 20230930) ready.
 04:42:56.925619 IP6 ::1.65426 > ::1.21: Flags [.], ack 57, win 4096, options [nop,nop,TS val 1 ecr 1], length 0
 04:42:58.819652 IP6 ::1.65426 > ::1.21: Flags [P.], seq 1:11, ack 57, win 4096, options [nop,nop,TS val 5 ecr 1], length 10: FTP: USER rvp
 04:42:58.831280 IP6 ::1.21 > ::1.65426: Flags [P.], seq 57:122, ack 11, win 4096, options [nop,nop,TS val 5 ecr 5], length 65: FTP: 331 User rvp accepted, provide password for [email protected].
 04:42:59.030621 IP6 ::1.65426 > ::1.21: Flags [.], ack 122, win 4096, options [nop,nop,TS val 6 ecr 5], length 0
 04:43:01.603623 IP6 ::1.65426 > ::1.21: Flags [P.], seq 11:26, ack 122, win 4096, options [nop,nop,TS val 11 ecr 5], length 15: FTP: PASS bh33ns11
 04:43:01.692169 IP6 ::1.21 > ::1.65426: Flags [P.], seq 122:128, ack 26, win 4096, options [nop,nop,TS val 11 ecr 11], length 6: FTP: 230-
 04:43:01.891621 IP6 ::1.65426 > ::1.21: Flags [.], ack 128, win 4096, options [nop,nop,TS val 11 ecr 11], length 0
 04:43:01.891652 IP6 ::1.21 > ::1.65426: Flags [P.], seq 128:475, ack 26, win 4096, options [nop,nop,TS val 11 ecr 11], length 347: FTP:     NetBSD 11.99.4 (COREBOOK_DIAG) #0: Sun Dec  7 04:08:07 UTC 2025
 04:43:01.893119 IP6 ::1.65426 > ::1.21: Flags [P.], seq 26:32, ack 475, win 4096, options [nop,nop,TS val 11 ecr 11], length 6: FTP: SYST
 04:43:01.893271 IP6 ::1.21 > ::1.65426: Flags [P.], seq 475:524, ack 32, win 4096, options [nop,nop,TS val 11 ecr 11], length 49: FTP: 215 UNIX Type: L8 Version: NetBSD-ftpd 20230930
 04:43:01.893540 IP6 ::1.65426 > ::1.21: Flags [P.], seq 32:38, ack 524, win 4096, options [nop,nop,TS val 11 ecr 11], length 6: FTP: FEAT
 04:43:01.893600 IP6 ::1.21 > ::1.65426: Flags [P.], seq 524:548, ack 38, win 4096, options [nop,nop,TS val 11 ecr 11], length 24: FTP: 211-Features supported
 04:43:02.093622 IP6 ::1.65426 > ::1.21: Flags [.], ack 548, win 4096, options [nop,nop,TS val 12 ecr 11], length 0
 04:43:02.093655 IP6 ::1.21 > ::1.65426: Flags [P.], seq 548:634, ack 38, win 4096, options [nop,nop,TS val 12 ecr 12], length 86: FTP:  MDTM
 04:43:02.293636 IP6 ::1.65426 > ::1.21: Flags [.], ack 634, win 4096, options [nop,nop,TS val 12 ecr 12], length 0
 04:43:07.003663 IP6 ::1.65426 > ::1.21: Flags [P.], seq 38:46, ack 634, win 4096, options [nop,nop,TS val 22 ecr 12], length 8: FTP: TYPE A
 04:43:07.003726 IP6 ::1.21 > ::1.65426: Flags [P.], seq 634:654, ack 46, win 4096, options [nop,nop,TS val 22 ecr 22], length 20: FTP: 200 Type set to A.
 04:43:07.203615 IP6 ::1.65426 > ::1.21: Flags [.], ack 654, win 4096, options [nop,nop,TS val 22 ecr 22], length 0
 04:43:13.003639 IP6 ::1.65426 > ::1.21: Flags [P.], seq 46:56, ack 654, win 4096, options [nop,nop,TS val 34 ecr 22], length 10: FTP: CWD /tmp
 04:43:13.003733 IP6 ::1.21 > ::1.65426: Flags [P.], seq 654:683, ack 56, win 4096, options [nop,nop,TS val 34 ecr 34], length 29: FTP: 250 CWD command successful.
 04:43:13.203610 IP6 ::1.65426 > ::1.21: Flags [.], ack 683, win 4096, options [nop,nop,TS val 34 ecr 34], length 0
 04:43:20.163696 IP6 ::1.65426 > ::1.21: Flags [P.], seq 56:69, ack 683, win 4096, options [nop,nop,TS val 48 ecr 34], length 13: FTP: SIZE in.txt
 04:43:20.163806 IP6 ::1.21 > ::1.65426: Flags [P.], seq 683:721, ack 69, win 4096, options [nop,nop,TS val 48 ecr 48], length 38: FTP: 550 in.txt: file too large for SIZE.
 04:43:20.164028 IP6 ::1.65426 > ::1.21: Flags [P.], seq 69:75, ack 721, win 4096, options [nop,nop,TS val 48 ecr 48], length 6: FTP: EPSV
 04:43:20.164176 IP6 ::1.21 > ::1.65426: Flags [P.], seq 721:769, ack 75, win 4096, options [nop,nop,TS val 48 ecr 48], length 48: FTP: 229 Entering Extended Passive Mode (|||65425|)
 04:43:20.164443 IP6 ::1.65424 > ::1.65425: Flags [S], seq 1247060766, win 32768, options [mss 33564,nop,wscale 3,sackOK,TS val 1 ecr 0], length 0
 04:43:20.164458 IP6 ::1.65425 > ::1.65424: Flags [S.], seq 1239190458, ack 1247060767, win 32768, options [mss 33564,nop,wscale 3,sackOK,TS val 1 ecr 1], length 0
 04:43:20.164469 IP6 ::1.65424 > ::1.65425: Flags [.], ack 1, win 4096, options [nop,nop,TS val 1 ecr 1], length 0
 04:43:20.164506 IP6 ::1.65426 > ::1.21: Flags [P.], seq 75:88, ack 769, win 4096, options [nop,nop,TS val 48 ecr 48], length 13: FTP: RETR in.txt
 04:43:20.164641 IP6 ::1.21 > ::1.65426: Flags [P.], seq 769:841, ack 88, win 4096, options [nop,nop,TS val 48 ecr 48], length 72: FTP: 150 Opening ASCII mode data connection for 'in.txt' (476494829 bytes).
 04:43:20.164731 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 1:1025, ack 1, win 4096, options [nop,nop,TS val 1 ecr 1], length 1024
 04:43:20.165003 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 1025:17409, ack 1, win 4096, options [nop,nop,TS val 1 ecr 1], length 16384
 04:43:20.165027 IP6 ::1.65424 > ::1.65425: Flags [.], ack 17409, win 1920, options [nop,nop,TS val 1 ecr 1], length 0
 04:43:20.165045 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 17409:18433, ack 1, win 4096, options [nop,nop,TS val 1 ecr 1], length 1024
 04:43:20.165292 IP6 ::1.65424 > ::1.65425: Flags [.], ack 18433, win 3840, options [nop,nop,TS val 1 ecr 1], length 0
 04:43:20.165308 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 18433:34817, ack 1, win 4096, options [nop,nop,TS val 1 ecr 1], length 16384
 04:43:20.165529 IP6 ::1.65424 > ::1.65425: Flags [.], ack 34817, win 3840, options [nop,nop,TS val 1 ecr 1], length 0
 04:43:20.165547 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 34817:46081, ack 1, win 4096, options [nop,nop,TS val 1 ecr 1], length 11264
 04:43:20.165783 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 46081:62465, ack 1, win 4096, options [nop,nop,TS val 1 ecr 1], length 16384
 04:43:20.165808 IP6 ::1.65424 > ::1.65425: Flags [.], ack 62465, win 2048, options [nop,nop,TS val 1 ecr 1], length 0
 04:43:20.165834 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 62465:63489, ack 1, win 4096, options [nop,nop,TS val 1 ecr 1], length 1024
 04:43:20.166023 IP6 ::1.65424 > ::1.65425: Flags [.], ack 63489, win 3968, options [nop,nop,TS val 1 ecr 1], length 0
 04:43:20.166038 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 63489:74753, ack 1, win 4096, options [nop,nop,TS val 1 ecr 1], length 11264
 04:43:20.166267 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 74753:91137, ack 1, win 4096, options [nop,nop,TS val 1 ecr 1], length 16384
 04:43:20.166293 IP6 ::1.65424 > ::1.65425: Flags [.], ack 91137, win 2048, options [nop,nop,TS val 1 ecr 1], length 0
 04:43:20.166311 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 91137:92161, ack 1, win 4096, options [nop,nop,TS val 1 ecr 1], length 1024
 04:43:20.166463 IP6 ::1.65424 > ::1.65425: Flags [.], ack 92161, win 3968, options [nop,nop,TS val 1 ecr 1], length 0
 04:43:20.166477 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 92161:103425, ack 1, win 4096, options [nop,nop,TS val 1 ecr 1], length 11264
 04:43:20.166696 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 103425:119809, ack 1, win 4096, options [nop,nop,TS val 1 ecr 1], length 16384
 04:43:20.166740 IP6 ::1.65424 > ::1.65425: Flags [.], ack 119809, win 2048, options [nop,nop,TS val 1 ecr 1], length 0
 04:43:20.166761 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 119809:120833, ack 1, win 4096, options [nop,nop,TS val 1 ecr 1], length 1024
 04:43:20.166920 IP6 ::1.65424 > ::1.65425: Flags [.], ack 120833, win 3968, options [nop,nop,TS val 1 ecr 1], length 0
 04:43:20.166962 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 120833:135169, ack 1, win 4096, options [nop,nop,TS val 1 ecr 1], length 14336
 04:43:20.364623 IP6 ::1.65426 > ::1.21: Flags [.], ack 841, win 4096, options [nop,nop,TS val 48 ecr 48], length 0
 04:43:20.366588 IP6 ::1.65424 > ::1.65425: Flags [.], ack 135169, win 4096, options [nop,nop,TS val 1 ecr 1], length 0
 04:43:20.366627 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 135169:148481, ack 1, win 4096, options [nop,nop,TS val 1 ecr 1], length 13312
 04:43:20.566609 IP6 ::1.65424 > ::1.65425: Flags [.], ack 148481, win 4096, options [nop,nop,TS val 2 ecr 1], length 0
 04:43:20.566638 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 148481:162817, ack 1, win 4096, options [nop,nop,TS val 2 ecr 2], length 14336
 04:43:20.766615 IP6 ::1.65424 > ::1.65425: Flags [.], ack 162817, win 4096, options [nop,nop,TS val 2 ecr 2], length 0
 04:43:20.766643 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 162817:176129, ack 1, win 4096, options [nop,nop,TS val 2 ecr 2], length 13312
 04:43:20.966615 IP6 ::1.65424 > ::1.65425: Flags [.], ack 176129, win 4096, options [nop,nop,TS val 3 ecr 2], length 0
 04:43:20.966643 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 176129:190465, ack 1, win 4096, options [nop,nop,TS val 3 ecr 3], length 14336
 04:43:21.166615 IP6 ::1.65424 > ::1.65425: Flags [.], ack 190465, win 4096, options [nop,nop,TS val 3 ecr 3], length 0
 04:43:21.166644 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 190465:203777, ack 1, win 4096, options [nop,nop,TS val 3 ecr 3], length 13312
 04:43:21.366614 IP6 ::1.65424 > ::1.65425: Flags [.], ack 203777, win 4096, options [nop,nop,TS val 3 ecr 3], length 0
 04:43:21.366641 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 203777:218113, ack 1, win 4096, options [nop,nop,TS val 3 ecr 3], length 14336
 04:43:21.566615 IP6 ::1.65424 > ::1.65425: Flags [.], ack 218113, win 4096, options [nop,nop,TS val 4 ecr 3], length 0
 04:43:21.566642 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 218113:231425, ack 1, win 4096, options [nop,nop,TS val 4 ecr 4], length 13312
 04:43:21.766614 IP6 ::1.65424 > ::1.65425: Flags [.], ack 231425, win 4096, options [nop,nop,TS val 4 ecr 4], length 0
 04:43:21.766643 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 231425:245761, ack 1, win 4096, options [nop,nop,TS val 4 ecr 4], length 14336
 04:43:21.966614 IP6 ::1.65424 > ::1.65425: Flags [.], ack 245761, win 4096, options [nop,nop,TS val 5 ecr 4], length 0
 04:43:21.966642 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 245761:259073, ack 1, win 4096, options [nop,nop,TS val 5 ecr 5], length 13312
 04:43:22.166615 IP6 ::1.65424 > ::1.65425: Flags [.], ack 259073, win 4096, options [nop,nop,TS val 5 ecr 5], length 0
 04:43:22.166643 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 259073:273409, ack 1, win 4096, options [nop,nop,TS val 5 ecr 5], length 14336
 04:43:22.366622 IP6 ::1.65424 > ::1.65425: Flags [.], ack 273409, win 4096, options [nop,nop,TS val 5 ecr 5], length 0
 04:43:22.366653 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 273409:286721, ack 1, win 4096, options [nop,nop,TS val 5 ecr 5], length 13312
 04:43:22.566614 IP6 ::1.65424 > ::1.65425: Flags [.], ack 286721, win 4096, options [nop,nop,TS val 6 ecr 5], length 0
 04:43:22.566643 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 286721:301057, ack 1, win 4096, options [nop,nop,TS val 6 ecr 6], length 14336
 04:43:22.766617 IP6 ::1.65424 > ::1.65425: Flags [.], ack 301057, win 4096, options [nop,nop,TS val 6 ecr 6], length 0
 04:43:22.766645 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 301057:314369, ack 1, win 4096, options [nop,nop,TS val 6 ecr 6], length 13312
 04:43:22.966615 IP6 ::1.65424 > ::1.65425: Flags [.], ack 314369, win 4096, options [nop,nop,TS val 7 ecr 6], length 0
 04:43:22.966644 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 314369:328705, ack 1, win 4096, options [nop,nop,TS val 7 ecr 7], length 14336
 04:43:23.166607 IP6 ::1.65424 > ::1.65425: Flags [.], ack 328705, win 4096, options [nop,nop,TS val 7 ecr 7], length 0
 04:43:23.166636 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 328705:342017, ack 1, win 4096, options [nop,nop,TS val 7 ecr 7], length 13312
 04:43:23.366620 IP6 ::1.65424 > ::1.65425: Flags [.], ack 342017, win 4096, options [nop,nop,TS val 7 ecr 7], length 0
 04:43:23.366660 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 342017:356353, ack 1, win 4096, options [nop,nop,TS val 7 ecr 7], length 14336
 04:43:23.566617 IP6 ::1.65424 > ::1.65425: Flags [.], ack 356353, win 4096, options [nop,nop,TS val 8 ecr 7], length 0
 04:43:23.566647 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 356353:369665, ack 1, win 4096, options [nop,nop,TS val 8 ecr 8], length 13312
 04:43:23.766607 IP6 ::1.65424 > ::1.65425: Flags [.], ack 369665, win 4096, options [nop,nop,TS val 8 ecr 8], length 0
 04:43:23.766636 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 369665:384001, ack 1, win 4096, options [nop,nop,TS val 8 ecr 8], length 14336
 04:43:23.966614 IP6 ::1.65424 > ::1.65425: Flags [.], ack 384001, win 4096, options [nop,nop,TS val 9 ecr 8], length 0
 04:43:23.966644 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 384001:397313, ack 1, win 4096, options [nop,nop,TS val 9 ecr 9], length 13312
 04:43:24.166610 IP6 ::1.65424 > ::1.65425: Flags [.], ack 397313, win 4096, options [nop,nop,TS val 9 ecr 9], length 0
 04:43:24.166639 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 397313:411649, ack 1, win 4096, options [nop,nop,TS val 9 ecr 9], length 14336
 04:43:24.366616 IP6 ::1.65424 > ::1.65425: Flags [.], ack 411649, win 4096, options [nop,nop,TS val 9 ecr 9], length 0
 04:43:24.366644 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 411649:424961, ack 1, win 4096, options [nop,nop,TS val 9 ecr 9], length 13312
 04:43:24.566616 IP6 ::1.65424 > ::1.65425: Flags [.], ack 424961, win 4096, options [nop,nop,TS val 10 ecr 9], length 0
 04:43:24.566645 IP6 ::1.65425 > ::1.65424: Flags [P.], seq 424961:439297, ack 1, win 4096, options [nop,nop,TS val 10 ecr 10], length 14336
 
 ---END tcpdump output---
 
 ---START TCP_NODELAY log---
 $ /tmp/obj/usr/src/usr.bin/ftp/ftp localhost
 Trying [::1]:21 ...
 Connected to localhost.
 220 localhost FTP server (NetBSD-ftpd 20230930) ready.
 Name (localhost:rvp): 
 331 User rvp accepted, provide password for [email protected].
 Password: 
 230-
      NetBSD 11.99.6 (GENERIC) #0: Fri Jul 10 21:54:30 UTC 2026
 
      Welcome to NetBSD!
 
      This is a development snapshot of NetBSD for testing -- user beware!
 
      Bug reports: https://www.NetBSD.org/support/send-pr.html
      Donations to the NetBSD Foundation: https://www.NetBSD.org/donations/
 230 User rvp logged in.
 Remote system type is UNIX.
 Using binary mode to transfer files.
 ftp> ascii
 200 Type set to A.
 ftp> progress
 Progress bar off.
 ftp> cd /tmp
 250 CWD command successful.
 ftp> get in.txt out.txt
 local: out.txt remote: in.txt
 229 Entering Extended Passive Mode (|||65505|)
 150 Opening ASCII mode data connection for 'in.txt' (306795321 bytes).
 226 Transfer complete.
 312128515 bytes received in 00:02 (145.34 MiB/s)
 ftp> put in.txt out.txt
 local: in.txt remote: out.txt
 229 Entering Extended Passive Mode (|||65503|)
 150 Opening ASCII mode data connection for 'out.txt'.
 226 Transfer complete.
 312128515 bytes sent in 00:02 (116.24 MiB/s)
 ftp> passive
 Passive mode: off; fallback to active mode: off.
 ftp> get in.txt out.txt
 local: out.txt remote: in.txt
 200 EPRT command successful.
 150 Opening ASCII mode data connection for 'in.txt' (306795321 bytes).
 226 Transfer complete.
 312128515 bytes received in 00:02 (140.56 MiB/s)
 ftp> put in.txt out.txt
 local: in.txt remote: out.txt
 200 EPRT command successful.
 150 Opening ASCII mode data connection for 'out.txt'.
 226 Transfer complete.
 312128515 bytes sent in 00:01 (148.86 MiB/s)
 ftp> ^D
 221-
      Data traffic for this session was 1237847672 bytes in 4 files.
      Total traffic for this session was 1237849263 bytes in 4 transfers.
 221 Thank you for using the FTP service on localhost.
 
 $
 ---END TCP_NODELAY log---
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.