#!/bin/bash

nic_in_mirror() {
	brctl show | egrep -o eth[0-9\.]+$ | cut -d '.' -f1 | sort -u
}

cpu_count() {
	grep -c 'model name' /proc/cpuinfo
}

echo "В зеркале $(nic_in_mirror | wc -l) сетёвки"
echo "Имеется $(cpu_count) ядра на процессоре"

queue2irq() {
	grep "$1" /proc/interrupts | tr -d ':' | awk '{print $1}'
}

queue_affinity() {
	cat /proc/irq/$1/smp_affinity_list
}

queue_affinities() {
	for q in $@; do
		local irq=$(queue2irq $q)
		local aff=$(queue_affinity $irq)
		echo queue $q irq $irq affinity $aff
	done
}

vmware_queue() {
	local queues="$(egrep -o $1-rxtx-[0-9]+ /proc/interrupts)"
	echo "У $1 $(echo "$queues" | wc -l) очереди"
	echo "$queues"
	if [ "$(echo "$queues" | wc -l)" -ge $(cpu_count) -a "$(cpu_count)" -gt 1 ]; then
		echo "Можно снизить нагрузку, распределив прерывания сетёвки по ядрам процессора"
		echo "Текущее распределение:"
		grep "$1-rxtx" /proc/interrupts
	else
		echo "Что-то не совсем понятно, можно ли снизить нагрузку раскидыванием прерываний"
	fi
}

ixgbe_queue() {
	local queues="$(egrep -o $1-TxRx-[0-9]+ /proc/interrupts)"
	echo "У $1 $(echo "$queues" | wc -l) очереди"
	echo "$queues"
	if [ "$(echo "$queues" | wc -l)" -ge $(cpu_count) -a "$(cpu_count)" -gt 1 ]; then
		echo "Можно снизить нагрузку, распределив прерывания сетёвки по ядрам процессора"
		echo "Текущее распределение:"
		queue_affinities $queues
		if [ "$(queue_affinities $queues | awk '{print $6}' | sort -u | wc -l)" = 1 ]; then
			echo "Все прерывания сетевой карты скорее всего находятся на одном процессоре"
			echo "Однозначно рекомендуется раскидывать прерывания"
		fi
	else
		echo "Что-то не совсем понятно, можно ли снизить нагрузку раскидыванием прерываний"
	fi
}

broadcom_queue() {
	local queues="$(egrep -o $1-q[0-9]+ /proc/interrupts)"
	echo "У $1 $(echo "$queues" | wc -l) очереди"
	echo "$queues"
	if [ "$(echo "$queues" | wc -l)" -ge $(cpu_count) -a "$(cpu_count)" -gt 1 ]; then
		echo "Можно снизить нагрузку, распределив прерывания сетёвки по ядрам процессора"
		echo "Текущее распределение:"
		queue_affinities $queues
		if [ "$(queue_affinities $queues | awk '{print $6}' | sort -u | wc -l)" = 1 ]; then
			echo "Все прерывания сетевой карты скорее всего находятся на одном процессоре"
			echo "Однозначно рекомендуется раскидывать прерывания"
		fi
	else
		echo "Что-то не совсем понятно, можно ли снизить нагрузку раскидыванием прерываний"
	fi
}

realtek() {
	echo "Купите Intel и не мучайтесь :)"
}

dlink() {
	realtek
}

e1000_queue() {
	:
}

for i in $(nic_in_mirror); do
	echo
	echo "# $i"
	echo
	if ethtool -i $i | grep -q vmxnet3; then
		vmware_queue $i
	elif ethtool -i $i | grep -q e1000; then
		e1000_queue $i
	elif ethtool -i $i | grep -q ixgbe; then
		ixgbe_queue $i
	elif ethtool -i $i | grep -q be2net; then
		broadcom_queue $i
	fi
done
