From 09e1e79e7047805293a6b77ef681014e041c23dd Mon Sep 17 00:00:00 2001 From: fumingwei Date: Mon, 25 Apr 2022 16:04:30 +0800 Subject: [PATCH] =?UTF-8?q?feature:TSG-10393:TSG-X=5FP0804=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E4=B8=8B=E9=85=8D=E7=BD=AEkni=E5=88=B0tfe=E9=80=9A?= =?UTF-8?q?=E8=AE=AF=E7=BD=91=E5=8D=A1=E7=9A=84rpm=E5=86=85=E6=A0=B8?= =?UTF-8?q?=E7=BB=91=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ansible/roles/tfe/tasks/main.yml | 5 ++ .../service_add_StartPostForRps.conf.j2.j2 | 4 ++ .../files/script/obtain_rps_mask.py | 61 +++++++++++++++++++ .../tasks/provision.yml.TSGXNXR620G40R01P0804 | 33 ++++++++++ 4 files changed, 103 insertions(+) create mode 100644 ansible/roles/tfe/templates/service_add_StartPostForRps.conf.j2.j2 create mode 100644 ansible/roles/tsg-os-provision/files/script/obtain_rps_mask.py diff --git a/ansible/roles/tfe/tasks/main.yml b/ansible/roles/tfe/tasks/main.yml index 46451e71..909fadb6 100644 --- a/ansible/roles/tfe/tasks/main.yml +++ b/ansible/roles/tfe/tasks/main.yml @@ -100,6 +100,11 @@ - /usr/lib/systemd/system/tfe-env.service - /usr/lib/systemd/system/tfe.service +- name: "template the pangu_pxy.conf" + template: + src: "{{ role_path }}/templates/service_add_StartPostForRps.conf.j2.j2" + dest: /opt/tsg/tsg-os-provision/templates/service_add_StartPostForRps.conf.j2 + ##################### tfe ##################### - name: "systemctl daemon-reload" systemd: diff --git a/ansible/roles/tfe/templates/service_add_StartPostForRps.conf.j2.j2 b/ansible/roles/tfe/templates/service_add_StartPostForRps.conf.j2.j2 new file mode 100644 index 00000000..c16e99b3 --- /dev/null +++ b/ansible/roles/tfe/templates/service_add_StartPostForRps.conf.j2.j2 @@ -0,0 +1,4 @@ +[Service] +{% raw %}{% for i in range( tfe_env_rps_info.rps_size ) %} +ExecStartPost=/bin/sh -c "echo {{tfe_env_rps_info.rps_mask}} > /sys/class/net/${TFE_DEVICE_DATA_INCOMING}/queues/rx-{{i}}/rps_cpus" +{% endfor %}{% endraw %} diff --git a/ansible/roles/tsg-os-provision/files/script/obtain_rps_mask.py b/ansible/roles/tsg-os-provision/files/script/obtain_rps_mask.py new file mode 100644 index 00000000..17770c4e --- /dev/null +++ b/ansible/roles/tsg-os-provision/files/script/obtain_rps_mask.py @@ -0,0 +1,61 @@ +#!/usr/bin/env python3 +import psutil +import platform +import subprocess +import yaml +import math +import json + +CPU_LAYOUTS_CONF_PATH = "/opt/tsg/tsg-os-provision/.cpu_layouts.json" + +def get_cpu_machine(): + model_info = (subprocess.check_output("lscpu | grep \"Model name:\" | head -n 1 | sed -r \'s/Model name:\s{1,}//g\'", shell=True).strip()).decode() + socket_info = int((subprocess.check_output("lscpu | grep \"Socket(s):\" | head -n 1 | sed -r \'s/Socket\(s\):\s{1,}//g\'", shell=True).strip()).decode()) + #return (psutil.cpu_count(), retstr) + return (model_info, socket_info) + +def get_cpu_layouts(): + with open(CPU_LAYOUTS_CONF_PATH, 'r',encoding='utf-8') as f: + temp=json.load(f) + f.close() + return temp + +def get_cpu_affinity(): + matched = 0 + tfe_cpu_affinity = [] + mrzcpd_cpu_affinity = [] + cpu_machine = get_cpu_machine() + cpu_layouts = get_cpu_layouts() + for layout in cpu_layouts: + if (layout['match']['sockets'] == cpu_machine[1]) and (cpu_machine[0].find(layout['match']['model_name']) != -1): + matched = 1 + tfe_cpu_affinity = layout['tfe_affinity'] + mrzcpd_cpu_affinity = layout['mrzcpd_affinity'] + break + if matched == 0: + print("Warning: not match cpu model name and sockets,please checkout cpuinfo and cpu_layouts config ...") + exit(1) + return (mrzcpd_cpu_affinity, tfe_cpu_affinity) + +def calc_rps_mask(): + rps_list_size = math.ceil(psutil.cpu_count()/32) + rps_list = [0] * rps_list_size + cpu_affinity = get_cpu_affinity() + for core in cpu_affinity[1]: + rps_list_index = core // 32 + rps_core_location = core % 32 + rps_list[rps_list_index] = rps_list[rps_list_index] | (2 ** rps_core_location) + + result_queue_rps = "" + is_top = False + for rps in reversed(rps_list): + if is_top == False: + result_queue_rps = ('%x' % rps) + is_top = True + else: + result_queue_rps = result_queue_rps + ',' + ('%08x' % rps) + result_output = {"rps_size": len(cpu_affinity[0]), "rps_mask": result_queue_rps} + print(json.dumps(result_output)) + +if __name__ == '__main__': + calc_rps_mask() diff --git a/ansible/roles/tsg-os-provision/files/tasks/provision.yml.TSGXNXR620G40R01P0804 b/ansible/roles/tsg-os-provision/files/tasks/provision.yml.TSGXNXR620G40R01P0804 index 30c0bca7..a061cd21 100644 --- a/ansible/roles/tsg-os-provision/files/tasks/provision.yml.TSGXNXR620G40R01P0804 +++ b/ansible/roles/tsg-os-provision/files/tasks/provision.yml.TSGXNXR620G40R01P0804 @@ -36,6 +36,39 @@ ######setting cpu affinity end###### +######setting nic cpu affinity mask start###### + - name: output cpu_layouts config to config .cpu_layouts.json + copy: + content: "{{ cpu_layouts| to_json }}" + dest: /opt/tsg/tsg-os-provision/.cpu_layouts.json + + - name: "tsg-os-provision: obtain rps_mask" + shell: /opt/tsg/tsg-os-provision/scripts/obtain_rps_mask.py + register: result_exec_obtain_rps_mask + + - name: "tsg-os-provision: check result_exec_obtain_rps_mask" + assert: + that: + - result_exec_obtain_rps_mask.rc == 0 + - result_exec_obtain_rps_mask.failed == False + fail_msg: "error:{{ result_exec_obtain_rps_mask.stderr }},stdout:{{ result_exec_obtain_rps_mask.stdout_lines }}" + success_msg: "Successded: obtain rpm mask" + + - name: "set rps_mask into tfe-env-config" + set_fact: + tfe_env_rps_info: "{{ result_exec_obtain_rps_mask.stdout | from_json }}" + + - name: "output tfe_env_rps_info" + debug: + msg: "{{ tfe_env_rps_info }}" + + - name: "template tfe-env service for rps mask" + template: + src: ../templates/service_add_StartPostForRps.conf.j2 + dest: /usr/lib/systemd/system/tfe-env.service.d/service_add_StartPostForRps.conf + +######setting nic cpu affinity mask end###### + - name: "set keep_alive_ip" set_fact: gdev_conf_keep_alive_ip: "{{ etherfabric_settings.keepalive.ip }}"