src/bin/download-speed.rs: h2 download speedtest for our server
I get about 30MB/s (much too slow)
This commit is contained in:
		@ -260,7 +260,7 @@ fn speedtest(
 | 
				
			|||||||
    _rpcenv: Box<dyn RpcEnvironment>,
 | 
					    _rpcenv: Box<dyn RpcEnvironment>,
 | 
				
			||||||
) -> Result<BoxFut, Error> {
 | 
					) -> Result<BoxFut, Error> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let buffer = vec![2u8; 8*1024*1024]; // nonsense [2,2,2,2,2...]
 | 
					    let buffer = vec![65u8; 1024*1024]; // nonsense [A,A,A...]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let body = Body::from(buffer);
 | 
					    let body = Body::from(buffer);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										95
									
								
								src/bin/download-speed.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								src/bin/download-speed.rs
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,95 @@
 | 
				
			|||||||
 | 
					use failure::*;
 | 
				
			||||||
 | 
					use futures::*;
 | 
				
			||||||
 | 
					use std::io::Write;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//use std::sync::Arc;
 | 
				
			||||||
 | 
					//use serde_json::Value;
 | 
				
			||||||
 | 
					use chrono::{DateTime, Local};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//use proxmox_backup::tools;
 | 
				
			||||||
 | 
					//use proxmox_backup::backup::*;
 | 
				
			||||||
 | 
					use proxmox_backup::client::*;
 | 
				
			||||||
 | 
					//use proxmox_backup::pxar;
 | 
				
			||||||
 | 
					//use futures::stream::Stream;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					pub struct DummyWriter {
 | 
				
			||||||
 | 
					    bytes: usize,
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					impl Write for DummyWriter {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn write(&mut self, data: &[u8]) -> Result<usize, std::io::Error> {
 | 
				
			||||||
 | 
					        self.bytes += data.len();
 | 
				
			||||||
 | 
					        Ok(data.len())
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn flush(&mut self) -> Result<(), std::io::Error> {
 | 
				
			||||||
 | 
					        Ok(())
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn run() -> Result<(), Error> {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let host = "localhost";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let username = "root@pam";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let client = HttpClient::new(host, username)?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let backup_time = "2019-06-28T10:49:48+02:00".parse::<DateTime<Local>>()?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let client = client.start_backup_reader("store2", "host", "elsa", backup_time, true).wait()?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    let start = std::time::SystemTime::now();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    futures::stream::repeat(())
 | 
				
			||||||
 | 
					        .take(100)
 | 
				
			||||||
 | 
					        .and_then(|_| {
 | 
				
			||||||
 | 
					            let writer = DummyWriter { bytes: 0 };
 | 
				
			||||||
 | 
					            client.speedtest(writer)
 | 
				
			||||||
 | 
					                .and_then(|writer| {
 | 
				
			||||||
 | 
					                    println!("Received {} bytes", writer.bytes);
 | 
				
			||||||
 | 
					                    Ok(writer.bytes)
 | 
				
			||||||
 | 
					                })
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        .fold(0, move |mut acc, size| {
 | 
				
			||||||
 | 
					            acc += size;
 | 
				
			||||||
 | 
					            Ok::<_, Error>(acc)
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        .then(move |result| {
 | 
				
			||||||
 | 
					            match result {
 | 
				
			||||||
 | 
					                Err(err) => {
 | 
				
			||||||
 | 
					                    println!("ERROR {}", err);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                Ok(bytes) => {
 | 
				
			||||||
 | 
					                    let elapsed = start.elapsed().unwrap();
 | 
				
			||||||
 | 
					                    let elapsed = (elapsed.as_secs() as f64) +
 | 
				
			||||||
 | 
					                        (elapsed.subsec_millis() as f64)/1000.0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    println!("Downloaded {} bytes, {} MB/s", bytes, (bytes as f64)/(elapsed*1024.0*1024.0));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            Ok::<_, Error>(())
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        .wait()?;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    Ok(())
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn main() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    //let mut rt = tokio::runtime::Runtime::new().unwrap();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // should be rt.block_on_all, but this block forever in release builds
 | 
				
			||||||
 | 
					    tokio::run(lazy(move || {
 | 
				
			||||||
 | 
					   // let _ = rt.block_on(lazy(move || -> Result<(), ()> {
 | 
				
			||||||
 | 
					        if let Err(err) = run() {
 | 
				
			||||||
 | 
					            eprintln!("ERROR: {}", err);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        println!("DONE1");
 | 
				
			||||||
 | 
					        Ok(())
 | 
				
			||||||
 | 
					    }));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    println!("DONE2");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -500,6 +500,13 @@ impl BackupReader {
 | 
				
			|||||||
        self.h2.download(path, Some(param), output)
 | 
					        self.h2.download(path, Some(param), output)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    pub fn speedtest<W: Write>(
 | 
				
			||||||
 | 
					        &self,
 | 
				
			||||||
 | 
					        output: W,
 | 
				
			||||||
 | 
					    ) -> impl Future<Item=W, Error=Error> {
 | 
				
			||||||
 | 
					        self.h2.download("speedtest", None, output)
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    pub fn download_chunk<W: Write>(
 | 
					    pub fn download_chunk<W: Write>(
 | 
				
			||||||
        &self,
 | 
					        &self,
 | 
				
			||||||
        digest: &[u8; 32],
 | 
					        digest: &[u8; 32],
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user