Linux kernel 设置32核的接收数据包控制(RPS)

Linux kernel 设置32核的接收数据包控制(RPS),linux-kernel,multiprocessing,Linux Kernel,Multiprocessing,我不确定我是否使用了正确的命令来设置32核机器的RPS。这就是我使用的:echo 1f>/sys/class/net/eth0/queues/rx-0/rps\u cpu 应该是“echo 1f…”还是“echo f…”或其他什么?Pinterest工程师只需: 但还有一点: 从内核的角度看不出实际的差异,但您可以尝试从forRed Hat Enterprise Linux 7复制这两种版本: rps_CPU文件使用逗号分隔的CPU位图。因此, 允许CPU处理服务器上接收队列的中断 接口,将其在

我不确定我是否使用了正确的命令来设置32核机器的RPS。这就是我使用的:echo 1f>/sys/class/net/eth0/queues/rx-0/rps\u cpu

应该是“echo 1f…”还是“echo f…”或其他什么?

Pinterest工程师只需:

但还有一点:

从内核的角度看不出实际的差异,但您可以尝试从forRed Hat Enterprise Linux 7复制这两种版本:

rps_CPU文件使用逗号分隔的CPU位图。因此, 允许CPU处理服务器上接收队列的中断 接口,将其在位图中的位置值设置为1。对于 例如,要使用CPU 0、1、2和3处理中断,请设置该值 rps_CPU到00001111(1+2+4+8)或f(的十六进制值) 15)

所以对于四核CPU

echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus
对于大于4核的CPU

echo ff+ > /sys/class/net/eth0/queues/rx-0/rps_cpus

其中ff+是一个正则表达式,用于为每组额外的4个核追加额外的f

您可能需要尝试使用二进制计算器和nproc:

echo“obase=16;2^$(nproc)-1”| bc>/sys/class/net/eth0/queues/rx-0/rps\u cpu
这个公式将为任意数量的核配置RPS。

我使用了这个公式

# Input
NIC_NAME="em1";
if [[ "$1" != "" ]]; then
    NIC_NAME="$1";
fi

# Tuna Install 
#echo "`date '+%Y-%m-%d %H:%M:%S'` - Install numactl" ;
#yum install -y tuna ;

# Tuna Config
echo "`date '+%Y-%m-%d %H:%M:%S'` - Tuna Info: " ;
tuna --irqs=${NIC_NAME}-\* --cpus=0-3 --move --spread ;
tuna --irqs=${NIC_NAME}-txrx-\* --cpus=0-3 --move --spread ;
tuna --irqs=${NIC_NAME}-tx-\* --cpus=0-3 --move --spread ;
tuna --irqs=${NIC_NAME}-rx-\* --cpus=0-3 --move --spread ;
tuna --irqs=${NIC_NAME}-\* --show_irqs ;

# Install
#echo "`date '+%Y-%m-%d %H:%M:%S'` - Install numactl" ;
#yum install -y numactl ;
#echo "";

# Numa Info
echo "`date '+%Y-%m-%d %H:%M:%S'` - Numa Info: " ;
numactl --hardware | grep "^node . cpus" ;
echo "";

# Numa Mask
echo "`date '+%Y-%m-%d %H:%M:%S'` - Numa Mask: " ;
NUMA_COUNT=$(numactl --hardware | grep "^node . cpus\:" | wc -l);
NUMA_MASK=("");
i=0;
while [ $i -lt ${NUMA_COUNT} ]; do
    NUMA_MASK[$i]=$(numactl --hardware | grep "^node $i cpus\:" | awk -F':' '{ print $2}' | sed 's/ /\+2\^/g' | awk '{print "obase=16;0" $0}' | bc | rev | sed -e 's/\([0-F][0-F][0-F][0-F][0-F][0-F][0-F][0-F]\)/\1,/g' | rev);
    echo " NUMA_MASK[$i]: ${NUMA_MASK[$i]}";
    let i++;
done
echo "";

# Set RPS/XPS
echo "`date '+%Y-%m-%d %H:%M:%S'` - Set RPS/XPS: " ;
QUEUE_RX_COUNT=0;
QUEUE_TX_COUNT=0;
i=0;
while [ $i -lt 16 ]; do
    let NUMA_ID=(i % NUMA_COUNT);
    QUEUE_RX_RPS="/sys/class/net/${NIC_NAME}/queues/rx-$i/rps_cpus";
    QUEUE_TX_XPS="/sys/class/net/${NIC_NAME}/queues/tx-$i/xps_cpus";
    if [[ -e "${QUEUE_RX_RPS}" && "${NUMA_MASK[$NUMA_ID]}" != "" ]]; then
        echo ${NUMA_MASK[$NUMA_ID]} > "${QUEUE_RX_RPS}" ;
        NUMA_MASK_ID=$(cat "${QUEUE_RX_RPS}");
        echo " ${QUEUE_RX_RPS}: $NUMA_MASK_ID" ;
        let QUEUE_RX_COUNT++;
    fi;
    if [[ -e "${QUEUE_TX_XPS}" && "${NUMA_MASK[$NUMA_ID]}" != "" ]]; then
        echo ${NUMA_MASK[$NUMA_ID]} > "${QUEUE_TX_XPS}" ;
        NUMA_MASK_ID=$(cat "${QUEUE_TX_XPS}");
        echo " ${QUEUE_TX_XPS}: $NUMA_MASK_ID" ;
        let QUEUE_TX_COUNT++;
    fi;
    let i++;
done
echo "";

# Set Sock Rps Flow
echo "`date '+%Y-%m-%d %H:%M:%S'` - Set Sock Rps Flow: " ;
SOCK_RX_FLOW_ENTRIES="/proc/sys/net/core/rps_sock_flow_entries" ;
SOCK_RX_FLOW_COUNT=32768 ;
echo "${SOCK_RX_FLOW_COUNT}" > ${SOCK_RX_FLOW_ENTRIES} ;
SOCK_RX_FLOW_COUNT=$(cat ${SOCK_RX_FLOW_ENTRIES}) ;
echo " ${SOCK_RX_FLOW_ENTRIES}: ${SOCK_RX_FLOW_COUNT}" ;
echo "";

# Set Queue Rps Flow
echo "`date '+%Y-%m-%d %H:%M:%S'` - Set Queue Rps Flow: " ;
let SET_QUEUE_RX_FLOW_COUNT=(SOCK_RX_FLOW_COUNT / QUEUE_RX_COUNT);
i=0;
while [ $i -lt 16 ]; do
    QUEUE_RX_FLOW="/sys/class/net/${NIC_NAME}/queues/rx-$i/rps_flow_cnt";
    if [[ -e "${QUEUE_RX_FLOW}" && ${SET_QUEUE_RX_FLOW_COUNT} -gt 0 ]]; then
        echo ${SET_QUEUE_RX_FLOW_COUNT} > "${QUEUE_RX_FLOW}" ;
        GET_QUEUE_RX_FLOW_COUNT=$(cat "${QUEUE_RX_FLOW}");
        echo " ${QUEUE_RX_FLOW}: ${GET_QUEUE_RX_FLOW_COUNT}" ;
    fi;
    let i++;
done
echo "";
我还看到了
符号。我的机器拒绝接受这个。
除此之外,我还看到重新启动后,值被重置为0。我通过定义启用和启动将值更正为ff的服务来绕过它(这是我想要的)。

如果需要帮助,您必须说明问题。您在哪里找到指定
rps\U CPU
标志接受
ff+
regex?Gustavo,他不是这么说的——他希望stackoverflow用户接受正则表达式并提供适当数量的EFF。
echo ff+ > /sys/class/net/eth0/queues/rx-0/rps_cpus
# Input
NIC_NAME="em1";
if [[ "$1" != "" ]]; then
    NIC_NAME="$1";
fi

# Tuna Install 
#echo "`date '+%Y-%m-%d %H:%M:%S'` - Install numactl" ;
#yum install -y tuna ;

# Tuna Config
echo "`date '+%Y-%m-%d %H:%M:%S'` - Tuna Info: " ;
tuna --irqs=${NIC_NAME}-\* --cpus=0-3 --move --spread ;
tuna --irqs=${NIC_NAME}-txrx-\* --cpus=0-3 --move --spread ;
tuna --irqs=${NIC_NAME}-tx-\* --cpus=0-3 --move --spread ;
tuna --irqs=${NIC_NAME}-rx-\* --cpus=0-3 --move --spread ;
tuna --irqs=${NIC_NAME}-\* --show_irqs ;

# Install
#echo "`date '+%Y-%m-%d %H:%M:%S'` - Install numactl" ;
#yum install -y numactl ;
#echo "";

# Numa Info
echo "`date '+%Y-%m-%d %H:%M:%S'` - Numa Info: " ;
numactl --hardware | grep "^node . cpus" ;
echo "";

# Numa Mask
echo "`date '+%Y-%m-%d %H:%M:%S'` - Numa Mask: " ;
NUMA_COUNT=$(numactl --hardware | grep "^node . cpus\:" | wc -l);
NUMA_MASK=("");
i=0;
while [ $i -lt ${NUMA_COUNT} ]; do
    NUMA_MASK[$i]=$(numactl --hardware | grep "^node $i cpus\:" | awk -F':' '{ print $2}' | sed 's/ /\+2\^/g' | awk '{print "obase=16;0" $0}' | bc | rev | sed -e 's/\([0-F][0-F][0-F][0-F][0-F][0-F][0-F][0-F]\)/\1,/g' | rev);
    echo " NUMA_MASK[$i]: ${NUMA_MASK[$i]}";
    let i++;
done
echo "";

# Set RPS/XPS
echo "`date '+%Y-%m-%d %H:%M:%S'` - Set RPS/XPS: " ;
QUEUE_RX_COUNT=0;
QUEUE_TX_COUNT=0;
i=0;
while [ $i -lt 16 ]; do
    let NUMA_ID=(i % NUMA_COUNT);
    QUEUE_RX_RPS="/sys/class/net/${NIC_NAME}/queues/rx-$i/rps_cpus";
    QUEUE_TX_XPS="/sys/class/net/${NIC_NAME}/queues/tx-$i/xps_cpus";
    if [[ -e "${QUEUE_RX_RPS}" && "${NUMA_MASK[$NUMA_ID]}" != "" ]]; then
        echo ${NUMA_MASK[$NUMA_ID]} > "${QUEUE_RX_RPS}" ;
        NUMA_MASK_ID=$(cat "${QUEUE_RX_RPS}");
        echo " ${QUEUE_RX_RPS}: $NUMA_MASK_ID" ;
        let QUEUE_RX_COUNT++;
    fi;
    if [[ -e "${QUEUE_TX_XPS}" && "${NUMA_MASK[$NUMA_ID]}" != "" ]]; then
        echo ${NUMA_MASK[$NUMA_ID]} > "${QUEUE_TX_XPS}" ;
        NUMA_MASK_ID=$(cat "${QUEUE_TX_XPS}");
        echo " ${QUEUE_TX_XPS}: $NUMA_MASK_ID" ;
        let QUEUE_TX_COUNT++;
    fi;
    let i++;
done
echo "";

# Set Sock Rps Flow
echo "`date '+%Y-%m-%d %H:%M:%S'` - Set Sock Rps Flow: " ;
SOCK_RX_FLOW_ENTRIES="/proc/sys/net/core/rps_sock_flow_entries" ;
SOCK_RX_FLOW_COUNT=32768 ;
echo "${SOCK_RX_FLOW_COUNT}" > ${SOCK_RX_FLOW_ENTRIES} ;
SOCK_RX_FLOW_COUNT=$(cat ${SOCK_RX_FLOW_ENTRIES}) ;
echo " ${SOCK_RX_FLOW_ENTRIES}: ${SOCK_RX_FLOW_COUNT}" ;
echo "";

# Set Queue Rps Flow
echo "`date '+%Y-%m-%d %H:%M:%S'` - Set Queue Rps Flow: " ;
let SET_QUEUE_RX_FLOW_COUNT=(SOCK_RX_FLOW_COUNT / QUEUE_RX_COUNT);
i=0;
while [ $i -lt 16 ]; do
    QUEUE_RX_FLOW="/sys/class/net/${NIC_NAME}/queues/rx-$i/rps_flow_cnt";
    if [[ -e "${QUEUE_RX_FLOW}" && ${SET_QUEUE_RX_FLOW_COUNT} -gt 0 ]]; then
        echo ${SET_QUEUE_RX_FLOW_COUNT} > "${QUEUE_RX_FLOW}" ;
        GET_QUEUE_RX_FLOW_COUNT=$(cat "${QUEUE_RX_FLOW}");
        echo " ${QUEUE_RX_FLOW}: ${GET_QUEUE_RX_FLOW_COUNT}" ;
    fi;
    let i++;
done
echo "";