1) На С, используя libcurl. По сравнению со скриптом на curl ускоряется в 3-5 раз. 2) Не закрывать соединение, если позволяет сервер, грузить много файлов через один коннект (это ускоряет в 10 раз). Этого мне хватало, чтобы загрузить канал 5Мбит с двух серверов.
Дальше проблеммы с ФС и винчестером: кончаются и-ноды; без дефрагментации ерзает головка, винчестеры летят «только в путь» (при использовании скаченного - летят также). Падают (или виснут) отдающие сервера, банят IP или ограничивают канал ~1Мбит, и т.д.
(Что за файлы? 2-20Кб или 1-10Мб ? Сколько отдающих серверов?)