Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

why is ftp upload slow in java 7

I wanted to ask if anyone knows about any Java 7 issues with FTP? I've used both the Sun Net and Apache Commons Net libraries and both perform as expected on Java 6. But when I switch my dev environment (Eclipse) to 1.7, the same operations perform really slow (about 4.5 to 8KB/s), and these are to localhost servers and another server within the LAN.

I've tried buffered streams, byte-to-byte transfer, turning the Nagle Algorithm off, and using the Apache convenience method storeFile(), with the latter finally performing to speed on localhost but slowing down again to a crawl on a remote server. I also set all machines to turn off stateful FTP filtering.

    InputStream is = null;
    OutputStream os = null;
    try {
        is = new BufferedInputStream(prepareInputStream(data));
        os = new BufferedOutputStream(prepareOutputStream(data));
        if (is == null || os == null) {
            log.error("Can't build connection");
            return;
        }

        byte[] buf = new byte[4096];
        int c = 1;

        while (c > 0) {
            c = is.read(buf);
            if (c > 0)
            os.write(buf, 0, c);
            data.incrCurrentPosition();
            fireStateChanged(data);
        }
        data.incrCurrentPosition();
    } catch (IOException e) {
        log.error(e.getMessage(), e);
        setEnabled(false);  
    } catch (Exception e) {
        log.error(e.getMessage(), e);
    } finally {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (os != null) {
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

As can be seen, this is pretty standard implementation code. Again, in Java 6, things zip by really quick. In Java 7, it slows down by a factor of 10 to 20 for both the Sun and Apache Commons libraries. Using an FTP client like FileZilla confirms that FTP is functioning normally, so I think it really has something to do with Java 7. I dug as far as I could online for any mention of a problem but, mostly, the things I saw were about the Java 7 and Windows 7 firewall conflict.

Thanks in advance for any insight given.

like image 763
Adam Law Avatar asked Dec 22 '12 05:12

Adam Law


People also ask

Why is my FTP upload so slow?

FTP upload and download speed depend mainly on the client's connection to the server. This may be affected by multiple network factors such as hop count and local connectivity. Also, there are other factors which may affect the speed: The number of clients that currently are using the FTP service.

How do I check my FTP upload speed?

Tele2 provides ftp://speedtest.tele2.net , you can log in as anonymous and upload anything to test your upload speed. For download testing they provide fixed size files, you can choose which fits best to your test. You can connect with username of anonymous and any password (e.g. anonymous ).

What is FTP speed?

In most FTP software programs, transfer speeds are recorded in kilobytes (KB) per second. Most internet connections are measured in kilobits (Kb) per second. One kilobyte equals 8 kilobits.


2 Answers

I found a fix of sorts, at least enough to get things running normally in Java 7. I did it by using FTPClient's setBufferSize(0); Unfortunately, I don't think there's a similar method in Sun's Java 7's Sun Net implementation. Not that it matters to me as I'm quite pleased with Apache Commons Net. Hopefully, Oracle will get to the bottom of this in due time.

like image 79
Adam Law Avatar answered Nov 15 '22 19:11

Adam Law


Please check what your current buffer size is with :

ftpClient.getBufferSize();

If you haven't already set it to something else, that will be zero (0). So, set it to a higher value :

ftpClient.setBufferSize(1048576);//1024*1024

You can check its current value as before :

ftpClient.getBufferSize();

By the way, the accepted answer, setBufferSize(0), did not work for me. I use the latest version of Apache commons, so probably that solution worked with earlier versions. If you set buffer size to zero, there will be no change with the current version.

like image 39
M-D Avatar answered Nov 15 '22 19:11

M-D