Не полный ответ, но если у вас есть какой-то демон или что-то, управляющее соединением, вы можете использовать TCP keepalive, чтобы поддерживать управляющее соединение в течение продолжительного периода времени.
FTP использует два соединения. Управляющее соединение устанавливается клиент-сервер, а соединения данных устанавливаются сервер-клиент для каждого запроса. Таким образом, каждый листинг каталога или GET будет предлагать открыть другое подключение к данным на время запроса.
Вам не нужно беспокоиться о том, чтобы множество открытых сокетов было открыто, поскольку соединения для передачи данных согласовываются через управляющее соединение непосредственно перед установкой. (Также соединения для передачи данных могут быть сделаны клиент-сервер вместо сервера-клиент, если вы хотите использовать пассивный режим, но это все еще отдельное соединение.)
В любом случае, я думаю, что источник медлительности больше связан с закрытием и повторным открытием управляющего соединения (и аутентификации) для каждого запроса. Я думаю, что если у вас есть какой-то процесс, который держит управляющее соединение открытым с использованием TCP keepalive (опция сокета SO_KEEPALIVE), вы увидите значительное улучшение.