Multithreading 如何加快向XDB写入点的速度?

Multithreading 如何加快向XDB写入点的速度?,multithreading,asynchronous,rust,influxdb,Multithreading,Asynchronous,Rust,Influxdb,我正在将点数(每批60k)写入XDB 点包含时间(i64)和值(f64) 看起来像 use influx_db_client::{ Client, Point, Points, Value, Precision }; use tokio; fn main() { let client = Client::new(Url::parse("http://localhost:8086").expect("Cannot parse url"), "test"); let da

我正在将点数(每批60k)写入XDB

点包含时间(i64)和值(f64)

看起来像

use influx_db_client::{
    Client, Point, Points, Value, Precision
};
use tokio;

fn main() {
    let client = Client::new(Url::parse("http://localhost:8086").expect("Cannot parse url"), "test");

    let data: Vec<Point> = get_data();

    tokio::runtime::Runtime::new().unwrap().block_on(async move { 
        for chunk in data.chunks(60000) {
            let points = Points::create_new(chunk.to_vec());
            client.write_points(points, Some(Precision::Milliseconds), None).await.expect("Cannot write points");   
        }
    });
}
使用流入数据库客户端::{
客户机、点、点、值、精度
};
使用东京;
fn main(){
让client=client::new(Url::parse(“http://localhost:8086expect(“无法解析url”),“test”);
let data:Vec=get_data();
tokio::runtime::runtime::new().unwrap().block_on(异步移动{
用于数据中的块。块(60000){
让点=点::创建新的(chunk.to_vec());
client.write_points(点,一些(精度:毫秒),无)。wait.expect(“无法写入点”);
}
});
}
它可以工作,需要6秒钟,但我认为它可能更快。 我尝试使用threadpool,但它不起作用,因为我无法创建很多客户端

use influx_db_client::{
    Client, Point, Points, Value, Precision
};
use tokio;
use threadpool::ThreadPool;

fn main() {
    let n_workers = 4;
    let data: Vec<Point> = get_data();
    let pool = ThreadPool::new(n_workers);
    for chunk in data.chunks(60000) {
        let points = Points::create_new(chunk.to_vec());
        pool.execute(move || {
            tokio::runtime::Runtime::new().unwrap().block_on(async move { 
                let client = Client::new(Url::parse("http://localhost:8086").expect("Cannot parse url"), "test");
                client.write_points(points, Some(Precision::Milliseconds), None).await.expect("Cannot write points");
            });
        });
    }
}
使用流入数据库客户端::{
客户机、点、点、值、精度
};
使用东京;
使用threadpool::threadpool;
fn main(){
设n_工人=4;
let data:Vec=get_data();
let pool=ThreadPool::new(n_工作者);
用于数据中的块。块(60000){
让点=点::创建新的(chunk.to_vec());
池。执行(移动| |){
tokio::runtime::runtime::new().unwrap().block_on(异步移动{
让client=client::new(Url::parse(“http://localhost:8086expect(“无法解析url”),“test”);
client.write_points(点,一些(精度:毫秒),无)。wait.expect(“无法写入点”);
});
});
}
}
所以我不知道如何更快地执行它

我可以使用异步吗? 也许你知道一些优化技巧


data
包含1400000个点(快速创建,1.3秒,获取数据()-0.627秒,区块循环(不调用client.write_点)-0.678秒)

你能看到创建客户端需要多少时间吗?您可以使用线程本地缓存来存储客户端并在每次重复使用它,而不是试图创建一个新的。@apatniv客户端创建需要0.01秒。据我所知,客户端向InfluxDB发送POST请求以写入点。@我不知道为什么,但当我使用线程\本地客户端时,并不是所有点都被写入。所以我把所有的期货都推给了vec,并执行了它。现在需要4秒而不是6秒。您可以将UDP传输与“XDB线路协议”一起使用。这在某些情况下很有用。将XDB配置为使用精度最低的数字时间格式。例如,您可以在influxdb.conf的
[[udp]]
部分中设置
precision=“ms”
。如果不了解CPU缓存的工作原理,请不要使用多线程。如果您的数据经常从一个CPU的缓存运行到另一个CPU的缓存(包括XDB中的数据),则不会获得速度提升。如果您在一个hdd(或ssd)上有一个数据库,请不要使用多个线程写入程序。您能看到创建客户端需要多少时间吗?您可以使用线程本地缓存来存储客户端并在每次重复使用它,而不是试图创建一个新的。@apatniv客户端创建需要0.01秒。据我所知,客户端向InfluxDB发送POST请求以写入点。@我不知道为什么,但当我使用线程\本地客户端时,并不是所有点都被写入。所以我把所有的期货都推给了vec,并执行了它。现在需要4秒而不是6秒。您可以将UDP传输与“XDB线路协议”一起使用。这在某些情况下很有用。将XDB配置为使用精度最低的数字时间格式。例如,您可以在influxdb.conf的
[[udp]]
部分中设置
precision=“ms”
。如果不了解CPU缓存的工作原理,请不要使用多线程。如果您的数据经常从一个CPU的缓存运行到另一个CPU的缓存(包括XDB中的数据),则不会获得速度提升。如果一个hdd(或ssd)上有数据库,请不要使用多个线程写入程序。