Increase tpu coalescing and add parameter (#15536)
Should create larger entries on average
This commit is contained in:
parent
5a9896706c
commit
05409e51ce
|
@ -91,6 +91,7 @@ fn main() -> Result<()> {
|
||||||
s_reader,
|
s_reader,
|
||||||
recycler.clone(),
|
recycler.clone(),
|
||||||
"bench-streamer-test",
|
"bench-streamer-test",
|
||||||
|
1,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@ impl FetchStage {
|
||||||
tpu_forwards_sockets: Vec<UdpSocket>,
|
tpu_forwards_sockets: Vec<UdpSocket>,
|
||||||
exit: &Arc<AtomicBool>,
|
exit: &Arc<AtomicBool>,
|
||||||
poh_recorder: &Arc<Mutex<PohRecorder>>,
|
poh_recorder: &Arc<Mutex<PohRecorder>>,
|
||||||
|
coalesce_ms: u64,
|
||||||
) -> (Self, PacketReceiver) {
|
) -> (Self, PacketReceiver) {
|
||||||
let (sender, receiver) = channel();
|
let (sender, receiver) = channel();
|
||||||
(
|
(
|
||||||
|
@ -36,6 +37,7 @@ impl FetchStage {
|
||||||
&sender,
|
&sender,
|
||||||
&poh_recorder,
|
&poh_recorder,
|
||||||
None,
|
None,
|
||||||
|
coalesce_ms,
|
||||||
),
|
),
|
||||||
receiver,
|
receiver,
|
||||||
)
|
)
|
||||||
|
@ -47,6 +49,7 @@ impl FetchStage {
|
||||||
sender: &PacketSender,
|
sender: &PacketSender,
|
||||||
poh_recorder: &Arc<Mutex<PohRecorder>>,
|
poh_recorder: &Arc<Mutex<PohRecorder>>,
|
||||||
allocated_packet_limit: Option<u32>,
|
allocated_packet_limit: Option<u32>,
|
||||||
|
coalesce_ms: u64,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let tx_sockets = sockets.into_iter().map(Arc::new).collect();
|
let tx_sockets = sockets.into_iter().map(Arc::new).collect();
|
||||||
let tpu_forwards_sockets = tpu_forwards_sockets.into_iter().map(Arc::new).collect();
|
let tpu_forwards_sockets = tpu_forwards_sockets.into_iter().map(Arc::new).collect();
|
||||||
|
@ -57,6 +60,7 @@ impl FetchStage {
|
||||||
&sender,
|
&sender,
|
||||||
&poh_recorder,
|
&poh_recorder,
|
||||||
allocated_packet_limit,
|
allocated_packet_limit,
|
||||||
|
coalesce_ms,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,6 +106,7 @@ impl FetchStage {
|
||||||
sender: &PacketSender,
|
sender: &PacketSender,
|
||||||
poh_recorder: &Arc<Mutex<PohRecorder>>,
|
poh_recorder: &Arc<Mutex<PohRecorder>>,
|
||||||
limit: Option<u32>,
|
limit: Option<u32>,
|
||||||
|
coalesce_ms: u64,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let recycler: PacketsRecycler =
|
let recycler: PacketsRecycler =
|
||||||
Recycler::warmed(1000, 1024, limit, "fetch_stage_recycler_shrink");
|
Recycler::warmed(1000, 1024, limit, "fetch_stage_recycler_shrink");
|
||||||
|
@ -113,6 +118,7 @@ impl FetchStage {
|
||||||
sender.clone(),
|
sender.clone(),
|
||||||
recycler.clone(),
|
recycler.clone(),
|
||||||
"fetch_stage",
|
"fetch_stage",
|
||||||
|
coalesce_ms,
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -124,6 +130,7 @@ impl FetchStage {
|
||||||
forward_sender.clone(),
|
forward_sender.clone(),
|
||||||
recycler.clone(),
|
recycler.clone(),
|
||||||
"fetch_forward_stage",
|
"fetch_forward_stage",
|
||||||
|
coalesce_ms,
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,7 @@ impl GossipService {
|
||||||
request_sender,
|
request_sender,
|
||||||
Recycler::new_without_limit("gossip-receiver-recycler-shrink-stats"),
|
Recycler::new_without_limit("gossip-receiver-recycler-shrink-stats"),
|
||||||
"gossip_receiver",
|
"gossip_receiver",
|
||||||
|
1,
|
||||||
);
|
);
|
||||||
let (response_sender, response_receiver) = channel();
|
let (response_sender, response_receiver) = channel();
|
||||||
let t_responder = streamer::responder("gossip", gossip_socket, response_receiver);
|
let t_responder = streamer::responder("gossip", gossip_socket, response_receiver);
|
||||||
|
|
|
@ -32,6 +32,7 @@ impl ServeRepairService {
|
||||||
request_sender,
|
request_sender,
|
||||||
Recycler::new_without_limit("serve-repair-receiver-recycler-shrink-stats"),
|
Recycler::new_without_limit("serve-repair-receiver-recycler-shrink-stats"),
|
||||||
"serve_repair_receiver",
|
"serve_repair_receiver",
|
||||||
|
1,
|
||||||
);
|
);
|
||||||
let (response_sender, response_receiver) = channel();
|
let (response_sender, response_receiver) = channel();
|
||||||
let t_responder =
|
let t_responder =
|
||||||
|
|
|
@ -149,6 +149,7 @@ impl ShredFetchStage {
|
||||||
packet_sender.clone(),
|
packet_sender.clone(),
|
||||||
recycler.clone(),
|
recycler.clone(),
|
||||||
"packet_modifier",
|
"packet_modifier",
|
||||||
|
1,
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
|
@ -29,6 +29,8 @@ use std::{
|
||||||
thread,
|
thread,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub const DEFAULT_TPU_COALESCE_MS: u64 = 5;
|
||||||
|
|
||||||
pub struct Tpu {
|
pub struct Tpu {
|
||||||
fetch_stage: FetchStage,
|
fetch_stage: FetchStage,
|
||||||
sigverify_stage: SigVerifyStage,
|
sigverify_stage: SigVerifyStage,
|
||||||
|
@ -59,6 +61,7 @@ impl Tpu {
|
||||||
replay_vote_receiver: ReplayVoteReceiver,
|
replay_vote_receiver: ReplayVoteReceiver,
|
||||||
replay_vote_sender: ReplayVoteSender,
|
replay_vote_sender: ReplayVoteSender,
|
||||||
bank_notification_sender: Option<BankNotificationSender>,
|
bank_notification_sender: Option<BankNotificationSender>,
|
||||||
|
tpu_coalesce_ms: u64,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
let (packet_sender, packet_receiver) = channel();
|
let (packet_sender, packet_receiver) = channel();
|
||||||
let fetch_stage = FetchStage::new_with_sender(
|
let fetch_stage = FetchStage::new_with_sender(
|
||||||
|
@ -70,6 +73,7 @@ impl Tpu {
|
||||||
// At 1024 packets per `Packet`, each packet about MTU size ~1k, this is roughly
|
// At 1024 packets per `Packet`, each packet about MTU size ~1k, this is roughly
|
||||||
// 20GB
|
// 20GB
|
||||||
Some(20_000),
|
Some(20_000),
|
||||||
|
tpu_coalesce_ms,
|
||||||
);
|
);
|
||||||
let (verified_sender, verified_receiver) = unbounded();
|
let (verified_sender, verified_receiver) = unbounded();
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ use crate::{
|
||||||
serve_repair_service::ServeRepairService,
|
serve_repair_service::ServeRepairService,
|
||||||
sigverify,
|
sigverify,
|
||||||
snapshot_packager_service::{PendingSnapshotPackage, SnapshotPackagerService},
|
snapshot_packager_service::{PendingSnapshotPackage, SnapshotPackagerService},
|
||||||
tpu::Tpu,
|
tpu::{Tpu, DEFAULT_TPU_COALESCE_MS},
|
||||||
transaction_status_service::TransactionStatusService,
|
transaction_status_service::TransactionStatusService,
|
||||||
tvu::{Sockets, Tvu, TvuConfig},
|
tvu::{Sockets, Tvu, TvuConfig},
|
||||||
};
|
};
|
||||||
|
@ -126,6 +126,7 @@ pub struct ValidatorConfig {
|
||||||
pub warp_slot: Option<Slot>,
|
pub warp_slot: Option<Slot>,
|
||||||
pub accounts_db_test_hash_calculation: bool,
|
pub accounts_db_test_hash_calculation: bool,
|
||||||
pub accounts_db_use_index_hash_calculation: bool,
|
pub accounts_db_use_index_hash_calculation: bool,
|
||||||
|
pub tpu_coalesce_ms: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for ValidatorConfig {
|
impl Default for ValidatorConfig {
|
||||||
|
@ -177,6 +178,7 @@ impl Default for ValidatorConfig {
|
||||||
warp_slot: None,
|
warp_slot: None,
|
||||||
accounts_db_test_hash_calculation: false,
|
accounts_db_test_hash_calculation: false,
|
||||||
accounts_db_use_index_hash_calculation: true,
|
accounts_db_use_index_hash_calculation: true,
|
||||||
|
tpu_coalesce_ms: DEFAULT_TPU_COALESCE_MS,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -681,6 +683,7 @@ impl Validator {
|
||||||
replay_vote_receiver,
|
replay_vote_receiver,
|
||||||
replay_vote_sender,
|
replay_vote_sender,
|
||||||
bank_notification_sender,
|
bank_notification_sender,
|
||||||
|
config.tpu_coalesce_ms,
|
||||||
);
|
);
|
||||||
|
|
||||||
datapoint_info!("validator-new", ("id", id.to_string(), String));
|
datapoint_info!("validator-new", ("id", id.to_string(), String));
|
||||||
|
|
|
@ -9,7 +9,7 @@ use solana_metrics::inc_new_counter_debug;
|
||||||
pub use solana_sdk::packet::{Meta, Packet, PACKET_DATA_SIZE};
|
pub use solana_sdk::packet::{Meta, Packet, PACKET_DATA_SIZE};
|
||||||
use std::{io::Result, net::UdpSocket, time::Instant};
|
use std::{io::Result, net::UdpSocket, time::Instant};
|
||||||
|
|
||||||
pub fn recv_from(obj: &mut Packets, socket: &UdpSocket, max_wait_ms: usize) -> Result<usize> {
|
pub fn recv_from(obj: &mut Packets, socket: &UdpSocket, max_wait_ms: u64) -> Result<usize> {
|
||||||
let mut i = 0;
|
let mut i = 0;
|
||||||
//DOCUMENTED SIDE-EFFECT
|
//DOCUMENTED SIDE-EFFECT
|
||||||
//Performance out of the IO without poll
|
//Performance out of the IO without poll
|
||||||
|
@ -27,7 +27,7 @@ pub fn recv_from(obj: &mut Packets, socket: &UdpSocket, max_wait_ms: usize) -> R
|
||||||
);
|
);
|
||||||
match recv_mmsg(socket, &mut obj.packets[i..]) {
|
match recv_mmsg(socket, &mut obj.packets[i..]) {
|
||||||
Err(_) if i > 0 => {
|
Err(_) if i > 0 => {
|
||||||
if start.elapsed().as_millis() > 1 {
|
if start.elapsed().as_millis() as u64 > max_wait_ms {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,7 @@ pub fn recv_from(obj: &mut Packets, socket: &UdpSocket, max_wait_ms: usize) -> R
|
||||||
i += npkts;
|
i += npkts;
|
||||||
// Try to batch into big enough buffers
|
// Try to batch into big enough buffers
|
||||||
// will cause less re-shuffling later on.
|
// will cause less re-shuffling later on.
|
||||||
if start.elapsed().as_millis() > max_wait_ms as u128 || i >= PACKETS_PER_BATCH {
|
if start.elapsed().as_millis() as u64 > max_wait_ms || i >= PACKETS_PER_BATCH {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@ fn recv_loop(
|
||||||
channel: &PacketSender,
|
channel: &PacketSender,
|
||||||
recycler: &PacketsRecycler,
|
recycler: &PacketsRecycler,
|
||||||
name: &'static str,
|
name: &'static str,
|
||||||
|
coalesce_ms: u64,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let mut recv_count = 0;
|
let mut recv_count = 0;
|
||||||
let mut call_count = 0;
|
let mut call_count = 0;
|
||||||
|
@ -52,7 +53,7 @@ fn recv_loop(
|
||||||
if exit.load(Ordering::Relaxed) {
|
if exit.load(Ordering::Relaxed) {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
if let Ok(len) = packet::recv_from(&mut msgs, sock, 1) {
|
if let Ok(len) = packet::recv_from(&mut msgs, sock, coalesce_ms) {
|
||||||
if len == NUM_RCVMMSGS {
|
if len == NUM_RCVMMSGS {
|
||||||
num_max_received += 1;
|
num_max_received += 1;
|
||||||
}
|
}
|
||||||
|
@ -86,6 +87,7 @@ pub fn receiver(
|
||||||
packet_sender: PacketSender,
|
packet_sender: PacketSender,
|
||||||
recycler: PacketsRecycler,
|
recycler: PacketsRecycler,
|
||||||
name: &'static str,
|
name: &'static str,
|
||||||
|
coalesce_ms: u64,
|
||||||
) -> JoinHandle<()> {
|
) -> JoinHandle<()> {
|
||||||
let res = sock.set_read_timeout(Some(Duration::new(1, 0)));
|
let res = sock.set_read_timeout(Some(Duration::new(1, 0)));
|
||||||
if res.is_err() {
|
if res.is_err() {
|
||||||
|
@ -96,7 +98,14 @@ pub fn receiver(
|
||||||
.name("solana-receiver".to_string())
|
.name("solana-receiver".to_string())
|
||||||
.spawn(move || {
|
.spawn(move || {
|
||||||
thread_mem_usage::datapoint(name);
|
thread_mem_usage::datapoint(name);
|
||||||
let _ = recv_loop(&sock, exit, &packet_sender, &recycler.clone(), name);
|
let _ = recv_loop(
|
||||||
|
&sock,
|
||||||
|
exit,
|
||||||
|
&packet_sender,
|
||||||
|
&recycler.clone(),
|
||||||
|
name,
|
||||||
|
coalesce_ms,
|
||||||
|
);
|
||||||
})
|
})
|
||||||
.unwrap()
|
.unwrap()
|
||||||
}
|
}
|
||||||
|
@ -207,6 +216,7 @@ mod test {
|
||||||
s_reader,
|
s_reader,
|
||||||
Recycler::new_without_limit(""),
|
Recycler::new_without_limit(""),
|
||||||
"test",
|
"test",
|
||||||
|
1,
|
||||||
);
|
);
|
||||||
let t_responder = {
|
let t_responder = {
|
||||||
let (s_responder, r_responder) = channel();
|
let (s_responder, r_responder) = channel();
|
||||||
|
|
|
@ -24,6 +24,7 @@ use solana_core::{
|
||||||
poh_service,
|
poh_service,
|
||||||
rpc::JsonRpcConfig,
|
rpc::JsonRpcConfig,
|
||||||
rpc_pubsub_service::PubSubConfig,
|
rpc_pubsub_service::PubSubConfig,
|
||||||
|
tpu::DEFAULT_TPU_COALESCE_MS,
|
||||||
validator::{is_snapshot_config_invalid, Validator, ValidatorConfig},
|
validator::{is_snapshot_config_invalid, Validator, ValidatorConfig},
|
||||||
};
|
};
|
||||||
use solana_download_utils::{download_genesis_if_missing, download_snapshot};
|
use solana_download_utils::{download_genesis_if_missing, download_snapshot};
|
||||||
|
@ -1243,6 +1244,14 @@ pub fn main() {
|
||||||
.takes_value(true)
|
.takes_value(true)
|
||||||
.help("Number of slots between compacting ledger"),
|
.help("Number of slots between compacting ledger"),
|
||||||
)
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::with_name("tpu_coalesce_ms")
|
||||||
|
.long("tpu-coalesce-ms")
|
||||||
|
.value_name("MILLISECS")
|
||||||
|
.takes_value(true)
|
||||||
|
.validator(is_parsable::<u64>)
|
||||||
|
.help("Milliseconds to wait in the TPU receiver for packet coalescing."),
|
||||||
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::with_name("rocksdb_max_compaction_jitter")
|
Arg::with_name("rocksdb_max_compaction_jitter")
|
||||||
.long("rocksdb-max-compaction-jitter-slots")
|
.long("rocksdb-max-compaction-jitter-slots")
|
||||||
|
@ -1509,6 +1518,8 @@ pub fn main() {
|
||||||
let rocksdb_compaction_interval = value_t!(matches, "rocksdb_compaction_interval", u64).ok();
|
let rocksdb_compaction_interval = value_t!(matches, "rocksdb_compaction_interval", u64).ok();
|
||||||
let rocksdb_max_compaction_jitter =
|
let rocksdb_max_compaction_jitter =
|
||||||
value_t!(matches, "rocksdb_max_compaction_jitter", u64).ok();
|
value_t!(matches, "rocksdb_max_compaction_jitter", u64).ok();
|
||||||
|
let tpu_coalesce_ms =
|
||||||
|
value_t!(matches, "tpu_coalesce_ms", u64).unwrap_or(DEFAULT_TPU_COALESCE_MS);
|
||||||
let wal_recovery_mode = matches
|
let wal_recovery_mode = matches
|
||||||
.value_of("wal_recovery_mode")
|
.value_of("wal_recovery_mode")
|
||||||
.map(BlockstoreRecoveryMode::from);
|
.map(BlockstoreRecoveryMode::from);
|
||||||
|
@ -1663,6 +1674,7 @@ pub fn main() {
|
||||||
accounts_db_caching_enabled: !matches.is_present("no_accounts_db_caching"),
|
accounts_db_caching_enabled: !matches.is_present("no_accounts_db_caching"),
|
||||||
accounts_db_test_hash_calculation: matches.is_present("accounts_db_test_hash_calculation"),
|
accounts_db_test_hash_calculation: matches.is_present("accounts_db_test_hash_calculation"),
|
||||||
accounts_db_use_index_hash_calculation: !matches.is_present("no_accounts_db_index_hashing"),
|
accounts_db_use_index_hash_calculation: !matches.is_present("no_accounts_db_index_hashing"),
|
||||||
|
tpu_coalesce_ms,
|
||||||
..ValidatorConfig::default()
|
..ValidatorConfig::default()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue