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---