[This is a resend; it looks as if my message didn't make it to the list the
first time.]
I'm having two types of libssh2 file transfer problems, and I hope someone
can help me.
First, upload performance is slow, especially on Windows.
Secondly, uploads don't work at all if I enable compression.
I am using libssh2-1.2.7 with the compression patch that can be found at:
http://www.libssh2.org/mail/libssh2-devel-archive-2010-09/0000.shtml
I am using libssh2 on two platforms: Windows 2003 R2, and Ubuntu 10.04.
The target servers are Solaris 10 x86 and Linux (standard sshd server).
When I enable compression, uploads fail with error -40 (compression error).
Without compression, uploads succeed, but performance is horrible on Windows
(0.4 MB/sec) and mediocre on Linux (2 MB/sec).
Download performance is good.
The client and server are running on different VMware hosts, with Xeon L5520
CPUs, lots of memory, little competing workload, and a 1 Gbit/sec Ethernet
between the two. So, the hardware is not the limiting factor. At any rate,
other clients on the same VMs get better performance.
Here's a table of performance. In case this doesn't render well in your
email client, I've also uploaded it here:
http://60bits.net/sni/libssh2-perf.htm
Client
Client OS
Server
Comp
Enable
File
Compressible
DL Speed
UL Speed
libssh2
Win
Solaris
No
No
12.98 MB/sec
0.42 MB/sec
libssh2
Win
Solaris
Yes
No
6.59 MB/sec
Fails
libssh2
Linux
Solaris
No
No
9.87 MB/sec
1.85 MB/sec
libssh2
Linux
Solaris
Yes
No
6.58 MB/sec
Fails
libssh2
Win
Linux
No
No
6.63 MB/sec
6.70 MB/sec
libssh2
Win
Linux
Yes
No
Fails: -5
BitVise Tunnelier
Win
Solaris
No
No
13.50 MB/sec
3.95 MB/sec
BitVise Tunnelier
Win
Solaris
Yes
No
8.541 MB/sec
10.2 MB/sec
Ubuntu sftp
Linux
Solaris
?
No
29.6 MB/sec
11.5 MB/sec
psftp
Win
Solaris
No
No
5.06 MB/sec
psftp
Win
Linux
No
No
6.58 MB/sec
I'm attaching a file containing the source (derived from a libssh2 sample)
and a Windows executable.
In case you don't want to look at the attachment, the relevant upload code
is:
hand = open(settings.localfile.c_str(), O_BINARY | O_RDONLY,
_S_IREAD);
if (-1 == hand) {
perror("opening local file");
exit(2);
}
int nwrites = 0;
// 32500 seems to be the buffer size that actually gets used,
// so to avoid partial buffers, I'm using exactly that size.
char mem[32500];
printf("Using output buffer size of %d bytes\n", sizeof(mem));
do {
/* loop until we fail */
int nbytes = read(hand, mem, sizeof(mem));
if (nbytes > 0) {
filesize += nbytes;
int offset = 0, bytes_to_send = nbytes;
// Loop to ensure that all of the input buffer is sent.
do {
rc = libssh2_sftp_write(sftp_handle, mem + offset,
bytes_to_send);
if (rc < 0) {
printf("libssh2_sftp_write failed with code %d\n", rc);
break;
}
++nwrites;
if (0 == (nwrites % 100)) {
printf("libssh2_sftp_write %d sent %d bytes\n", nwrites,
rc);
}
offset += rc;
bytes_to_send -= rc;
} while (bytes_to_send > 0);
} else {
break;
}
} while (rc >= 0);
} else {
puts("action must be get or put.");
exit(1);
}
close(hand);
libssh2_sftp_close(sftp_handle);
Thanks for any ideas you might have!
Mark R
_______________________________________________
libssh2-devel http://cool.haxx.se/cgi-bin/mailman/listinfo/libssh2-devel
Received on 2010-10-22