Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
irq_balance_habrahabr.sh
#!/bin/bash
# from http://habrahabr.ru/post/108240/
ncpus=`grep -ciw ^processor /proc/cpuinfo`
test "$ncpus" -gt 1 || exit 1
n=0
for irq in `cat /proc/interrupts | grep eth | awk '{print $1}' | sed s/\://g`
do
f="/proc/irq/$irq/smp_affinity"
test -r "$f" || continue
cpu=$[$ncpus - ($n % $ncpus) - 1]
if [ $cpu -ge 0 ]
then
mask=`printf %x $[2 ** $cpu]`
echo "Assign SMP affinity: eth queue $n, irq $irq, cpu $cpu, mask 0x$mask"
echo "$mask" > "$f"
let n+=1
fi
done
@unconditional

This comment has been minimized.

Copy link

unconditional commented Jun 25, 2015

http://www.smallo.ruhr.de/award.html is yours

cat /proc/interrupts | grep eth | awk '{print $1}' | sed s/\://g
-->
awk -F"[ :]" '/eth/{print $1}' /proc/interrupts

@hit0ri

This comment has been minimized.

Copy link

hit0ri commented Jun 25, 2015

You can replace line 4 with this:
ncpus=$(nproc)

@pavel-odintsov

This comment has been minimized.

Copy link
Owner Author

pavel-odintsov commented Jun 26, 2015

Thanks for feedback! But it's very draft tool and you could fix it as you want :)

@SaveTheRbtz

This comment has been minimized.

Copy link

SaveTheRbtz commented Nov 26, 2016

Intel provides set_irq_affinity.sh with their drivers, that can do that + XPS and NUMA:
https://gist.github.com/SaveTheRbtz/8875474

@jwbensley

This comment has been minimized.

Copy link

jwbensley commented Sep 9, 2017

@hit0ri - The problem with nrpoc is that if you are using isolcpu/nohz_full/rcu_nocbs it won't count those CPUs. Example case, we set nohz_full=1-15 isolcpus=1-15 rcu_nocbs=1-15 and use core 0 for OS, nproc returns 1 instead of 16.

ncpus=`grep -ciw ^processor /proc/cpuinfo` works fine.

@Jordynhollander

This comment has been minimized.

Copy link

Jordynhollander commented Nov 15, 2018

(dont ask me why, hehe) On php

	$numCpus = 1;
	$cpuinfo = file_get_contents('/proc/cpuinfo');
	preg_match_all('/^processor/m', $cpuinfo, $matches);
	$numCpus = count($matches[0]);
	$ethint = array();
	$baseethint = array();
	foreach(explode(PHP_EOL, file_get_contents("/proc/interrupts")) as $interrupt){
		foreach($interfaces as $eth){
			if (strpos($interrupt, $eth) !== false) {
				$name = @end(explode(" ", $interrupt));
				$ethint[$name] = (int)explode(":", $interrupt)[0];
				$basename = explode("-", $name)[0];
				if ($basename != $name) {
					$baseethint[$basename] = 1;
				}
			}
		}
	}
	$counter = 0;
	foreach($ethint as $name => $interrupt){
		$core = $counter % $numCpus;
		$basename = explode("-", $name)[0];
		if ($basename != $name || !array_key_exists ($basename, $baseethint)) {
			echo "\t".$name." - IRQ-".$interrupt." => ".$core."\n";
			file_put_contents("/proc/irq/".$interrupt."/smp_affinity", dechex(pow(2,$core)));
			$counter++;
		}
	}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.