Skip to content

Commit

Permalink
[image_config]: Enable Receive Packet Steering (RPS)
Browse files Browse the repository at this point in the history
 * This patch enables Receive Packet Steering (RPS) which helps to distribute
   softirq processing for CPU bound packets to all available cores. This will
   help prevent kernel packet drops when there are bouts of intense CPU bound
   packets.

   Ref: https://lwn.net/Articles/362339/
        https://docs.kernel.org/networking/scaling.html

Signed-off-by: Prabhat Aravind <paravind@microsoft.com>
  • Loading branch information
prabhataravind committed Oct 15, 2024
1 parent c883f16 commit ea3735f
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 1 deletion.
9 changes: 8 additions & 1 deletion files/build_templates/sonic_debian_extension.j2
Original file line number Diff line number Diff line change
Expand Up @@ -505,8 +505,10 @@ sudo cp $IMAGE_CONFIGS/resolv-config/update-containers $FILESYSTEM_ROOT/etc/reso
sudo cp $IMAGE_CONFIGS/interfaces/init_interfaces $FILESYSTEM_ROOT/etc/network/interfaces
sudo mkdir -p $FILESYSTEM_ROOT/etc/network/interfaces.d

# System'd network udev rules
# Systemd network udev rules
sudo cp $IMAGE_CONFIGS/systemd/network/* $FILESYSTEM_ROOT_ETC/systemd/network/
sudo mkdir -p $FILESYSTEM_ROOT_ETC/udev/rules.d
sudo cp $IMAGE_CONFIGS/udev/rules.d/* $FILESYSTEM_ROOT_ETC/udev/rules.d/

# copy core file uploader files
sudo cp $IMAGE_CONFIGS/corefile_uploader/core_uploader.service $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_SYSTEM
Expand Down Expand Up @@ -715,6 +717,11 @@ sudo cp $IMAGE_CONFIGS/backend_acl/backend-acl.service $FILESYSTEM_ROOT_USR_LIB_
sudo cp $IMAGE_CONFIGS/backend_acl/backend_acl.py $FILESYSTEM_ROOT/usr/bin/backend_acl.py
echo "backend-acl.service" | sudo tee -a $GENERATED_SERVICE_FILE

# Copy RPS script and service file
sudo cp $IMAGE_CONFIGS/rps/rps.service $FILESYSTEM_ROOT_USR_LIB_SYSTEMD_SYSTEM/rps.service
sudo cp $IMAGE_CONFIGS/rps/rps.py $FILESYSTEM_ROOT/usr/bin/rps.py
echo "rps.service" | sudo tee -a $GENERATED_SERVICE_FILE

# Copy SNMP configuration files
sudo cp $IMAGE_CONFIGS/snmp/snmp.yml $FILESYSTEM_ROOT/etc/sonic/

Expand Down
58 changes: 58 additions & 0 deletions files/image_config/rps/rps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
#!/usr/bin/env python3

import os
import sys

'''
Script to enable Receive Packet Steering (RPS)
'''
def get_num_cpus():
ncpus = 0
cpu_count = os.cpu_count()
if cpu_count is not None:
ncpus = cpu_count

return ncpus


def get_cpumask(ncpus):
return hex(pow(2, ncpus) - 1)[2:]


def configure_rps():
rv = 0
NET_DIR_PATH = "/sys/class/net"

num_cpus = get_num_cpus()
if not num_cpus:
rv = -1
return rv

cpumask = get_cpumask(num_cpus)
for intf in os.listdir(NET_DIR_PATH):
if "Ethernet" in intf:
queues_path = os.path.join(NET_DIR_PATH, intf, "queues")
queues = os.listdir(queues_path)
num_rx_queues = len([q for q in queues if q.startswith("rx")])
for q in range(num_rx_queues):
rps_cpus_path = os.path.join(queues_path, "rx-{}", "rps_cpus").format(q)
with open(rps_cpus_path, 'w') as file:
print ("Setting {} to cpu mask {}".format(rps_cpus_path, cpumask))
file.write(cpumask)

return rv


def main():
rv = 0
try:
rv = configure_rps()
except Exception as e:
print ("configure_rps exception occurred: {}".format(str(e)))

sys.exit(rv)


if __name__ == "__main__":
main()

1 change: 1 addition & 0 deletions files/image_config/udev/rules.d/99-rps.rules
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ACTION=="add", SUBSYSTEM=="net", KERNEL=="Ethernet*", RUN+="/usr/bin/rps.py"

0 comments on commit ea3735f

Please sign in to comment.