cpu pinning: set affinity to multiple hyperthreads, fix issues

This commit is contained in:
Joakim Frostegård 2021-11-07 13:31:03 +01:00
parent 03192d2afb
commit e86410291a
11 changed files with 181 additions and 165 deletions

View file

@ -25,12 +25,6 @@ pub const APP_NAME: &str = "aquatic_http: HTTP/TLS BitTorrent tracker";
const SHARED_CHANNEL_SIZE: usize = 1024;
pub fn run(config: Config) -> ::anyhow::Result<()> {
pin_current_if_configured_to(
&config.cpu_pinning,
config.socket_workers,
WorkerIndex::Other,
);
let state = State::default();
update_access_list(&config.access_list, &state.access_list)?;
@ -44,6 +38,12 @@ pub fn run(config: Config) -> ::anyhow::Result<()> {
::std::thread::spawn(move || run_inner(config, state));
}
pin_current_if_configured_to(
&config.cpu_pinning,
config.socket_workers,
WorkerIndex::Other,
);
for signal in &mut signals {
match signal {
SIGUSR1 => {
@ -57,12 +57,6 @@ pub fn run(config: Config) -> ::anyhow::Result<()> {
}
pub fn run_inner(config: Config, state: State) -> anyhow::Result<()> {
pin_current_if_configured_to(
&config.cpu_pinning,
config.socket_workers,
WorkerIndex::Other,
);
let num_peers = config.socket_workers + config.request_workers;
let request_mesh_builder = MeshBuilder::partial(num_peers, SHARED_CHANNEL_SIZE);
@ -82,16 +76,13 @@ pub fn run_inner(config: Config, state: State) -> anyhow::Result<()> {
let response_mesh_builder = response_mesh_builder.clone();
let num_bound_sockets = num_bound_sockets.clone();
let mut builder = LocalExecutorBuilder::default();
if config.cpu_pinning.active {
builder = builder.pin_to_cpu(
WorkerIndex::SocketWorker(i)
.get_cpu_index(&config.cpu_pinning, config.socket_workers),
let executor = LocalExecutorBuilder::default().spawn(move || async move {
pin_current_if_configured_to(
&config.cpu_pinning,
config.socket_workers,
WorkerIndex::SocketWorker(i),
);
}
let executor = builder.spawn(|| async move {
network::run_socket_worker(
config,
state,
@ -112,16 +103,13 @@ pub fn run_inner(config: Config, state: State) -> anyhow::Result<()> {
let request_mesh_builder = request_mesh_builder.clone();
let response_mesh_builder = response_mesh_builder.clone();
let mut builder = LocalExecutorBuilder::default();
if config.cpu_pinning.active {
builder = builder.pin_to_cpu(
WorkerIndex::RequestWorker(i)
.get_cpu_index(&config.cpu_pinning, config.socket_workers),
let executor = LocalExecutorBuilder::default().spawn(move || async move {
pin_current_if_configured_to(
&config.cpu_pinning,
config.socket_workers,
WorkerIndex::RequestWorker(i),
);
}
let executor = builder.spawn(|| async move {
handlers::run_request_worker(config, state, request_mesh_builder, response_mesh_builder)
.await
});
@ -136,6 +124,12 @@ pub fn run_inner(config: Config, state: State) -> anyhow::Result<()> {
)
.unwrap();
pin_current_if_configured_to(
&config.cpu_pinning,
config.socket_workers,
WorkerIndex::Other,
);
for executor in executors {
executor
.expect("failed to spawn local executor")