Скорость загрузки резко замедляется после загрузки пары файлов в Java - PullRequest
2 голосов
/ 07 марта 2019

Я пытаюсь загрузить данные из SEC. Я загружаю их локально, загружаю их в Amazon S3, а затем удаляю файлы локально. Размер файла составляет около 10-100 МБ. После загрузки нескольких файлов скорость загрузки значительно замедляется.

Вот пример вывода, который у меня есть. Пожалуйста, игнорируйте вещи 190 of 5761; Я начинаю его с 189, поэтому предыдущие записи не загружаются. Так что здесь происходит, что процесс запускается и загружает 3 файла, около 112 МБ, на высокой скорости. Затем он загружается только со скоростью 2-3 МБ / с и никогда не возвращается к первоначальной быстрой скорости (даже после 20 с лишним файлов, что является самым длинным периодом работы). Я также включил скорости загрузки - они не кажутся унизительными, не уверен, что это актуально.

        Downloading via wget: https://www.sec.gov/Archives/edgar/Feed/1996/QTR4/19961220.nc.tar.gz
        Elapsed: 0.934
        Size was 33 MB. Avg speed was 26 MB/s. 
        Finished uploading. Speed was 32 MB/s.
Downloading 190 of 5761: https://www.sec.gov/Archives/edgar/Feed/1996/QTR4/19961223.nc.tar.gz (current total: 33 MB; average speed: 14 MB/s)
        Downloading via wget: https://www.sec.gov/Archives/edgar/Feed/1996/QTR4/19961223.nc.tar.gz
        Elapsed: 1.523
        Size was 41 MB. Avg speed was 26 MB/s.
        Finished uploading. Speed was 59 MB/s.
Downloading 191 of 5761: https://www.sec.gov/Archives/edgar/Feed/1996/QTR4/19961224.nc.tar.gz (current total: 74 MB; average speed: 16 MB/s)
        Downloading via wget: https://www.sec.gov/Archives/edgar/Feed/1996/QTR4/19961224.nc.tar.gz
        Elapsed: 0.479
        Size was 38 MB. Avg speed was 79 MB/s.
        Finished uploading. Speed was 63 MB/s.
Downloading 192 of 5761: https://www.sec.gov/Archives/edgar/Feed/1996/QTR4/19961226.nc.tar.gz (current total: 112 MB; average speed: 20 MB/s)
        Downloading via wget: https://www.sec.gov/Archives/edgar/Feed/1996/QTR4/19961226.nc.tar.gz
        Elapsed: 3.859
        Size was 10 MB. Avg speed was 2 MB/s.
        Finished uploading. Speed was 37 MB/s.
Downloading 193 of 5761: https://www.sec.gov/Archives/edgar/Feed/1996/QTR4/19961227.nc.tar.gz (current total: 122 MB; average speed: 12 MB/s)
        Downloading via wget: https://www.sec.gov/Archives/edgar/Feed/1996/QTR4/19961227.nc.tar.gz
        Elapsed: 8.327
        Size was 30 MB. Avg speed was 3 MB/s.
        Finished uploading. Speed was 55 MB/s.

Дополнительная информация:

  • Я почти уверен, что это не ограничение скорости на сервере, потому что, когда я запускаю отдельную wget из командной строки для URL, который в данный момент загружается, загрузка происходит быстро
  • Я не храню эти файлы в памяти.
  • Я запускался несколько раз, и такое поведение происходит последовательно после 2-10 быстрых загрузок.
  • Я удаляю файлы сразу после их загрузки на отдельный сервер.
  • Использование ЦП и памяти не увеличивается во время выполнения процесса.
  • Фактические файлы / URL кажутся неактуальными: я могу начать загрузку с любого индекса (вместо 189), и поведение такое же.
  • Я запускаю это на Amazon EC2 с новой установкой + OpenJDK 1.8.

Я пробовал две разные реализации загрузки файлов, но обе версии имеют одну и ту же проблему. Вот мои реализации загрузки. Из реализации wget вы можете видеть, в частности, что это узкое место возникает в одном wget процессе, так как время Elapsed: __ увеличивается после падения скорости загрузки.

Загрузка с помощью Apache FileUtils

public static File downloadFileFromURL(String tmpPrefix, String url) throws IOException {
    File tmp = File.createTempFile(tmpPrefix, null);
    tmp.deleteOnExit();
    FileUtils.copyURLToFile(new URL(url), tmp);
    return tmp;
}

Загрузка с помощью вызова wget

public static File downloadFileFromURLViaWget(String url) throws IOException, InterruptedException {
    System.out.println("\tDownloading via wget: " + url);
    long start = System.currentTimeMillis();
    Process pr = Runtime.getRuntime().exec(new String[]{"wget", "-nv", url});
    pr.waitFor();
    System.out.println("\tElapsed: " + (System.currentTimeMillis() - start) / 1000.0);
    String fileName = url.substring(url.lastIndexOf('/') + 1);
    File f = new File(fileName);
    f.deleteOnExit();
    return f;
}

Я бы очень признателен за понимание этого вопроса. Я искал вокруг, но не нашел других сообщений об этой проблеме.

...