From 91fb1d3159145e7a0030f14aee8f9eb65eadf60d Mon Sep 17 00:00:00 2001 From: westtide Date: Tue, 17 Oct 2023 20:28:16 +0800 Subject: [PATCH] updat2: remove unneceeeary files --- .../config/modify.conf | 132 +++ .../config/sysctl_parameters.json | 1032 +++++++++++++++++ .../multisystem_performance/src/clean_data.py | 1 - .../multisystem_performance/src/clean_log.py | 1 - .../src/process_parameters.py | 178 ++- .../src/run_benchmark.py | 139 +++ .../tests/test_get_parameters.py | 116 ++ .../tests/test_process_parameters.py | 64 + 8 files changed, 1601 insertions(+), 62 deletions(-) create mode 100644 tools/multisystem_performance/config/modify.conf create mode 100644 tools/multisystem_performance/config/sysctl_parameters.json create mode 100644 tools/multisystem_performance/src/run_benchmark.py create mode 100644 tools/multisystem_performance/tests/test_get_parameters.py create mode 100644 tools/multisystem_performance/tests/test_process_parameters.py diff --git a/tools/multisystem_performance/config/modify.conf b/tools/multisystem_performance/config/modify.conf new file mode 100644 index 0000000..203deea --- /dev/null +++ b/tools/multisystem_performance/config/modify.conf @@ -0,0 +1,132 @@ +# 这是一个示例的.conf配置文件,你可以在这里配置要修改的syscyl/ulimit系统参数,提供分块修改/全局修改/单项修改的功能 + +[ulimit] +# 以下是ulimit的配置项,ulimit的参数较少,所以没有分块,直接在这里配置即可 +# 配置项的格式为:参数名 = 参数值,程序会自动识别参数名并修改,去掉#即可生效 +# 以下是示例配置,你可以根据自己的需求修改 + +-t = unlimited +# 表示 cpu time (seconds) 指定CPU使用时间的上限,单位为秒 +-f = unlimited +# 表示 file size (blocks) 最大文件大小(以 512 字节块为单位) +-d = unlimited +# 表示 data seg size (kbytes) 限制数据段(数据区)的大小,以千字节(KB)为单位 +-s = 4096 +# 表示 stack size (kbytes) 最大栈段大小(以千字节为单位) +-c = 0 +# 表示 core file size (blocks)最大核心文件大小(以 512 字节块为单位 +-m = unlimited +# 表示 resident set size (kbytes)指定可使用内存的上限,单位为KB +-u = 61501 +# 表示 processes 用户最多可开启的程序数目 +# -n = 1024 +# 表示 file descriptors 最大文件描述符加 1 +#-l = 64 +# 表示 locked-in-memory size (kbytes) 用于限制锁定在内存中的数据的大小,以 KB 为单位 +#-v = unlimited +# 表示 address space (kbytes) 指定可使用的虚拟内存上限,单位为KB +#-x = unlimited +# 表示 file locks 控制文件锁的数量,通常设置为 unlimited 表示没有限制 +#-i = 61501 +# 表示 pending signals 用于限制等待处理的信号的数量 +-q = 819200 +# 表示 bytes in POSIX msg queues 控制 POSIX 消息队列的大小,以字节为单位 +-e = 0 +# 表示 max nice 限制进程的 "nice" 值,即进程的优先级 +-r = 0 +# 表示 max rt priority 用于限制实时进程的优先级 + +[sysctl_block] +# sysctl:分块配置,分块配置与全局配置冲突,优先于单项修改 +# sysctl_block = 1 表示启用分块配置,启用某一块只需要去掉对应的#即可 +# sysctl_block = 0 表示禁用分块配置 +sysctl_block = 1 +ABI_Application_Binary_Interface = 1 +Encryption_Crypto = 1 +Debug = 1 +Device = 1 +RAID = 1 +SCSI = 1 +File_System = 1 +Inode_and_Dentry = 1 +File_Monitoring = 1 +Pipes_mqueue = 1 +Pipes_and_Message_Queues_pipe = 1 +File_Access_Control = 1 +Quota_Management = 1 +XFS_File_System = 1 +Pipes_and_Message_Queues_mqueue = 1 +Pipes_and_Message_Queues_pipe = 1 +Kernel_Locks = 1 +Kernel_Module = 1 +Kernel_Memory = 1 +Kernel_NUMA = 1 +Kernel_Panic = 1 +Kernel_Performance = 1 +Kernel_Processes_and_Tasks = 1 +Shutdown_Command = 1 +Kernel_Printing = 1 +Pseudo_Terminals = 1 +Kernel_Random_Number = 1 +Other_Kernel = 1 +Cpu_Scheduler = 1 +CPU0_SMT_Scheduling_Domain = 1 +CPU0_MC_Scheduling_Domain = 1 +CPU1_SMT_Scheduling_Domain = 1 +CPU1_MC_Scheduling_Domain = 1 +Kernel_Scheduler = 1 +System_Call_Filtering = 1 +Semaphore = 1 +Shared_Memory = 1 +Software_Watchdog_Timer = 1 +Hardware_Watchdog_Timer = 1 +Network_Core_net_core = 1 +BPF_Berkeley_Packet_Filter_JIT_Compiler = 1 +Busy_Polling_Mode = 1 +Queue_Scheduler = 1 +Network_Interface_Weight = 1 +IPv4_Items = 1 +IPv4_Global_Interface = 1 +IPv4_Default_Interface = 1 +IPv4_eth0_Interface = 1 +IPv4_lo_Interface = 1 +IPv6 = 1 +IPv6_Global = 1 +IPv6_Default_Interface = 1 +IPv6_Interface_Default = 1 +IPv6_Specific_enp1s0_Interface = 1 +IPv6_Specific_lo_Interface = 1 +IPv6_Specific_virbr0_Interface = 1 +IPv6_Multipath = 1 +IPv6_Flow_Label = 1 +IPv6_Fragmentation = 1 +IPv6_Neighbor_Discovery_Default_Interface = 1 +IPv6_Neighbor_Discovery_enp1s0_Interface = 1 +IPv6_Neighbor_Discovery_lo_Interface = 1 +IPv6_Neighbor_Discovery_virbr0_Interface = 1 +MPTCP = 1 +Network_Connection_Tracking_Basic = 1 +Network_Connection_Tracking_DCCP_Protocol = 1 +Network_Connection_Tracking_Event_and_Expected_Connection = 1 +Network_Connection_Tracking_IPv6_Fragment = 1 +Network_Connection_Tracking_General_and_Protocol_Specific_Timeout = 1 +Network_Connection_Tracking_SCTP_Protocol_Timeout = 1 +Network_Connection_Tracking_TCP = 1 +Network_Connection_Tracking_Logging = 1 +Sun_RPC_Related_Parameters = 1 +User_Namespace_Related_Parameters = 1 +Memory_Management = 1 + + +[sysctl_copy_all] +# sysctl:全局配置,全局配置与分块配置冲突,优先于单项修改 +# sysctl_copy_all = 1 表示启用全局配置,将载入的另一系统的所有配置 +# sysctl_copy_all = 0 表示禁用全局配置 +sysctl_copy_all = 0 + + +[sysctl_single_line] +# sysctl:单项修改 +# sysctl_single_line = 1 表示启用单项修改,将载入下方列出的系统参数与对应的值 +# sysctl_single_line = 0 表示禁用单项修改,不会载入下方列出的系统参数与对应的值 +sysctl_single_line = 1 \ No newline at end of file diff --git a/tools/multisystem_performance/config/sysctl_parameters.json b/tools/multisystem_performance/config/sysctl_parameters.json new file mode 100644 index 0000000..72a741c --- /dev/null +++ b/tools/multisystem_performance/config/sysctl_parameters.json @@ -0,0 +1,1032 @@ +{ + "ABI_Application_Binary_Interface": { + "abi.vsyscall32" + }, + "Encryption_Crypto": { + "crypto.fips_enabled", + "crypto.fips_name", + "crypto.fips_version" + }, + "Debug": { + "debug.exception-trace", + "debug.kprobes-optimization" + }, + "Device": { + "dev.hpet.max-user-freq", + "dev.i915.oa_max_sample_rate", + "dev.i915.perf_stream_paranoid", + "dev.mac_hid.mouse_button2_keycode", + "dev.mac_hid.mouse_button3_keycode", + "dev.mac_hid.mouse_button_emulation" + }, + "RAID": { + "dev.raid.speed_limit_max", + "dev.raid.speed_limit_min" + }, + "SCSI": { + "dev.scsi.logging_level" + }, + "File_System": { + "fs.aio-max-nr", + "fs.aio-nr", + "fs.binfmt_misc.status", + "fs.dentry-state", + "fs.dir-notify-enable", + "fs.epoll.max_user_watches", + "fs.file-max", + "fs.file-nr" + }, + "Inode_and_Dentry": { + "fs.inode-nr", + "fs.inode-state", + "File_Monitoring", + "fs.inotify.max_user_instances", + "fs.inotify.max_user_watches", + "fs.lease-break-time", + "fs.leases-enable", + "fs.mount-max" + }, + "Pipes_mqueue": { + "fs.mqueue.msg_default", + "fs.mqueue.msg_max", + "fs.mqueue.msgsize_default", + "fs.mqueue.msgsize_max", + "fs.mqueue.queues_max", + "fs.nr_open", + "fs.overflowgid", + "fs.overflowuid" + }, + "Pipes_and_Message_Queues_pipe": { + "fs.pipe-max-size", + "fs.pipe-user-pages-hard", + "fs.pipe-user-pages-soft" + }, + "File_Access_Control": { + "fs.protected_fifos", + "fs.protected_hardlinks", + "fs.protected_regular", + "fs.protected_symlinks" + }, + "Quota_Management": { + "fs.quota.allocated_dquots", + "fs.quota.cache_hits", + "fs.quota.drops", + "fs.quota.free_dquots", + "fs.quota.lookups", + "fs.quota.reads", + "fs.quota.syncs", + "fs.quota.warnings", + "fs.quota.writes", + "fs.suid_dumpable" + }, + "XFS_File_System": { + "fs.xfs.error_level", + "fs.xfs.filestream_centisecs", + "fs.xfs.inherit_noatime", + "fs.xfs.inherit_nodefrag", + "fs.xfs.inherit_nodump", + "fs.xfs.inherit_nosymlinks", + "fs.xfs.inherit_sync", + "fs.xfs.irix_sgid_inherit", + "fs.xfs.irix_symlink_mode", + "fs.xfs.panic_mask", + "fs.xfs.rotorstep", + "fs.xfs.speculative_cow_prealloc_lifetime", + "fs.xfs.speculative_prealloc_lifetime", + "fs.xfs.stats_clear", + "fs.xfs.xfssyncd_centisecs" + } + }, + "Kernel": { + "kernel.acct", + "kernel.acpi_video_flags", + "kernel.auto_msgmni", + "kernel.bootloader_type", + "kernel.bootloader_version", + "kernel.bpf_stats_enabled", + "Kernel_Processes_and_Tasks_1": { + "kernel.cad_pid", + "kernel.cap_last_cap", + "kernel.core_pattern", + "kernel.core_pipe_limit", + "kernel.core_uses_pid", + "kernel.ctrl-alt-del", + "kernel.dmesg_restrict", + "kernel.domainname", + "kernel.firmware_config.force_sysfs_fallback", + "kernel.firmware_config.ignore_sysfs_fallback", + "kernel.ftrace_dump_on_oops", + "kernel.ftrace_enabled", + "kernel.hardlockup_all_cpu_backtrace", + "kernel.hardlockup_panic", + "kernel.hostname" + }, + "Kernel_Processes_and_Tasks_2": { + "kernel.hung_task_check_count", + "kernel.hung_task_panic", + "kernel.hung_task_timeout_secs", + "kernel.hung_task_warnings", + "kernel.io_delay_type", + "kernel.kexec_load_disabled", + }, + "Key": { + "kernel.keys.gc_delay", + "kernel.keys.maxbytes", + "kernel.keys.maxkeys", + "kernel.keys.persistent_keyring_expiry", + "kernel.keys.root_maxbytes", + "kernel.keys.root_maxkeys", + "kernel.kptr_restrict" + }, + "Kernel_Locks": { + "kernel.max_lock_depth", + "kernel.max_rcu_stall_to_panic", + }, + "Kernel_Module": { + "kernel.modprobe", + "kernel.modules_disabled" + }, + "Kernel_Memory": { + "kernel.msg_next_id", + "kernel.msgmax", + "kernel.msgmnb", + "kernel.msgmni", + "kernel.ngroups_max", + "kernel.nmi_watchdog", + "kernel.ns_last_pid" + }, + "Kernel_NUMA": { + "kernel.numa_balancing", + "kernel.numa_balancing_scan_delay_ms", + "kernel.numa_balancing_scan_period_max_ms", + "kernel.numa_balancing_scan_period_min_ms", + "kernel.numa_balancing_scan_size_mb", + "kernel.osrelease", + "kernel.ostype", + "kernel.overflowgid", + "kernel.overflowuid" + }, + "Kernel_Panic": { + "kernel.panic", + "kernel.panic_on_io_nmi", + "kernel.panic_on_oops", + "kernel.panic_on_rcu_stall", + "kernel.panic_on_unrecovered_nmi", + "kernel.panic_on_warn", + "kernel.panic_print" + }, + "Kernel_Performance": { + "kernel.perf_cpu_time_max_percent", + "kernel.perf_event_max_contexts_per_stack", + "kernel.perf_event_max_sample_rate", + "kernel.perf_event_max_stack", + "kernel.perf_event_mlock_kb", + "kernel.perf_event_paranoid" + }, + "Kernel_Processes_and_Tasks": { + "kernel.pid_max" + }, + "Shutdown_Command": { + "kernel.poweroff_cmd" + }, + "Kernel_Printing": { + "kernel.print-fatal-signals", + "kernel.printk", + "kernel.printk_delay", + "kernel.printk_devkmsg", + "kernel.printk_ratelimit", + "kernel.printk_ratelimit_burst" + }, + "Pseudo_Terminals": { + "kernel.pty.max", + "kernel.pty.nr", + "kernel.pty.reserve" + }, + "Kernel_Random_Number": { + "kernel.random.boot_id", + "kernel.random.entropy_avail", + "kernel.random.poolsize", + "kernel.random.read_wakeup_threshold", + "kernel.random.urandom_min_reseed_secs", + "kernel.random.uuid", + "kernel.random.write_wakeup_threshold", + "kernel.randomize_va_space" + }, + "Other_Kernel": { + "kernel.real-root-dev", + "kernel.rh_flags" + }, + "Cpu_Scheduler": { + "kernel.sched_autogroup_enabled", + "kernel.sched_cfs_bandwidth_slice_us", + "kernel.sched_child_runs_first", + "kernel.sched_deadline_period_max_us", + "kernel.sched_deadline_period_min_us" + }, + "CPU0_SMT_Scheduling_Domain": { + "kernel.sched_domain.cpu0.domain0.busy_factor", + "kernel.sched_domain.cpu0.domain0.cache_nice_tries", + "kernel.sched_domain.cpu0.domain0.flags", + "kernel.sched_domain.cpu0.domain0.imbalance_pct", + "kernel.sched_domain.cpu0.domain0.max_interval", + "kernel.sched_domain.cpu0.domain0.max_newidle_lb_cost", + "kernel.sched_domain.cpu0.domain0.min_interval", + "kernel.sched_domain.cpu0.domain0.name" + }, + "CPU0_MC_Scheduling_Domain": { + "kernel.sched_domain.cpu0.domain1.busy_factor", + "kernel.sched_domain.cpu0.domain1.cache_nice_tries", + "kernel.sched_domain.cpu0.domain1.flags", + "kernel.sched_domain.cpu0.domain1.imbalance_pct", + "kernel.sched_domain.cpu0.domain1.max_interval", + "kernel.sched_domain.cpu0.domain1.max_newidle_lb_cost", + "kernel.sched_domain.cpu0.domain1.min_interval", + "kernel.sched_domain.cpu0.domain1.name" + }, + "CPU1_SMT_Scheduling_Domain": { + "kernel.sched_domain.cpu1.domain0.busy_factor", + "kernel.sched_domain.cpu1.domain0.cache_nice_tries", + "kernel.sched_domain.cpu1.domain0.flags", + "kernel.sched_domain.cpu1.domain0.imbalance_pct", + "kernel.sched_domain.cpu1.domain0.max_interval", + "kernel.sched_domain.cpu1.domain0.max_newidle_lb_cost", + "kernel.sched_domain.cpu1.domain0.min_interval", + "kernel.sched_domain.cpu1.domain0.name" + }, + "CPU1_MC_Scheduling_Domain": { + "kernel.sched_domain.cpu1.domain1.busy_factor", + "kernel.sched_domain.cpu1.domain1.cache_nice_tries", + "kernel.sched_domain.cpu1.domain1.flags", + "kernel.sched_domain.cpu1.domain1.imbalance_pct", + "kernel.sched_domain.cpu1.domain1.max_interval", + "kernel.sched_domain.cpu1.domain1.max_newidle_lb_cost", + "kernel.sched_domain.cpu1.domain1.min_interval", + "kernel.sched_domain.cpu1.domain1.name" + }, + "Kernel_Scheduler": { + "kernel.sched_energy_aware", + "kernel.sched_latency_ns", + "kernel.sched_migration_cost_ns", + "kernel.sched_min_granularity_ns", + "kernel.sched_nr_migrate", + "kernel.sched_rr_timeslice_ms", + "kernel.sched_rt_period_us", + "kernel.sched_rt_runtime_us", + "kernel.sched_schedstats", + "kernel.sched_tunable_scaling", + "kernel.sched_wakeup_granularity_ns" + }, + "System_Call_Filtering": { + "kernel.seccomp.actions_avail", + "kernel.seccomp.actions_logged" + }, + "Semaphore": { + "kernel.sem", + "kernel.sem_next_id" + }, + "Shared_Memory": { + "kernel.shm_next_id", + "kernel.shm_rmid_forced", + "kernel.shmall", + "kernel.shmmax", + "kernel.shmmni" + }, + "Software_Watchdog_Timer": { + "kernel.soft_watchdog", + "kernel.softlockup_all_cpu_backtrace", + "kernel.softlockup_panic", + "kernel.stack_tracer_enabled", + "kernel.sysctl_writes_strict", + "kernel.sysrq", + "kernel.tainted", + "kernel.threads-max", + "kernel.timer_migration", + "kernel.traceoff_on_warning", + "kernel.tracepoint_printk", + "kernel.unknown_nmi_panic", + "kernel.unprivileged_bpf_disabled", + "kernel.usermodehelper.bset", + "kernel.usermodehelper.inheritable", + "kernel.version" + }, + "Hardware_Watchdog_Timer": { + "kernel.watchdog", + "kernel.watchdog_cpumask", + "kernel.watchdog_thresh", + "kernel.yama.ptrace_scope" + } + }, + "Network_Core_net_core": { + "BPF_Berkeley_Packet_Filter_JIT_Compiler": { + "net.core.bpf_jit_enable", + "net.core.bpf_jit_harden", + "net.core.bpf_jit_kallsyms", + "net.core.bpf_jit_limit" + }, + "Busy_Polling_Mode": { + "net.core.busy_poll", + "net.core.busy_read" + }, + "Queue_Scheduler": { + "net.core.default_qdisc" + }, + "Network_Interface_Weight": { + "net.core.dev_weight", + "net.core.dev_weight_rx_bias", + "net.core.dev_weight_tx_bias", + "net.core.fb_tunnels_only_for_init_net", + "net.core.flow_limit_cpu_bitmap", + "net.core.flow_limit_table_len", + "net.core.max_skb_frags", + "net.core.message_burst", + "net.core.message_cost", + "net.core.netdev_budget", + "net.core.netdev_budget_usecs", + "net.core.netdev_max_backlog", + "net.core.netdev_rss_key", + "net.core.netdev_tstamp_prequeue", + "net.core.optmem_max", + "net.core.rmem_default", + "net.core.rmem_max", + "net.core.rps_default_mask", + "net.core.rps_sock_flow_entries", + "net.core.somaxconn", + "net.core.tstamp_allow_data", + "net.core.warnings" + } + }, + "IPv4_Items": { + "IPv4_Global_Interface": { + "net.ipv4.cipso_cache_bucket_size", + "net.ipv4.cipso_cache_enable", + "net.ipv4.cipso_rbm_optfmt", + "net.ipv4.cipso_rbm_strictvalid", + "net.ipv4.conf.all.accept_local", + "net.ipv4.conf.all.accept_redirects", + "net.ipv4.conf.all.accept_source_route", + "net.ipv4.conf.all.arp_accept", + "net.ipv4.conf.all.arp_announce", + "net.ipv4.conf.all.arp_filter", + "net.ipv4.conf.all.arp_ignore", + "net.ipv4.conf.all.arp_notify", + "net.ipv4.conf.all.bc_forwarding", + "net.ipv4.conf.all.bootp_relay", + "net.ipv4.conf.all.disable_policy", + "net.ipv4.conf.all.disable_xfrm", + "net.ipv4.conf.all.drop_gratuitous_arp", + "net.ipv4.conf.all.drop_unicast_in_l2_multicast", + "net.ipv4.conf.all.force_igmp_version", + "net.ipv4.conf.all.forwarding", + "net.ipv4.conf.all.igmpv2_unsolicited_report_interval", + "net.ipv4.conf.all.igmpv3_unsolicited_report_interval", + "net.ipv4.conf.all.ignore_routes_with_linkdown", + "net.ipv4.conf.all.log_martians", + "net.ipv4.conf.all.mc_forwarding", + "net.ipv4.conf.all.medium_id", + "net.ipv4.conf.all.promote_secondaries", + "net.ipv4.conf.all.proxy_arp", + "net.ipv4.conf.all.proxy_arp_pvlan", + "net.ipv4.conf.all.route_localnet", + "net.ipv4.conf.all.rp_filter", + "net.ipv4.conf.all.secure_redirects", + "net.ipv4.conf.all.send_redirects", + "net.ipv4.conf.all.shared_media", + "net.ipv4.conf.all.src_valid_mark", + "net.ipv4.conf.all.tag", + "net.ipv4.conf.all.ugc_tstamp", + "net.ipv4.conf.all.pim_rp_warn" + }, + "IPv4_Default_Interface": { + "net.ipv4.conf.default.accept_local", + "net.ipv4.conf.default.accept_redirects", + "net.ipv4.conf.default.accept_source_route", + "net.ipv4.conf.default.arp_accept", + "net.ipv4.conf.default.arp_announce", + "net.ipv4.conf.default.arp_filter", + "net.ipv4.conf.default.arp_ignore", + "net.ipv4.conf.default.arp_notify", + "net.ipv4.conf.default.bc_forwarding", + "net.ipv4.conf.default.bootp_relay", + "net.ipv4.conf.default.disable_policy", + "net.ipv4.conf.default.drop_gratuitous_arp", + "net.ipv4.conf.default.drop_unicast_in_l2_multicast", + "net.ipv4.conf.default.force_igmp_version", + "net.ipv4.conf.default.forwarding", + "net.ipv4.conf.default.igmpv2_unsolicited_report_interval", + "net.ipv4.conf.default.igmpv3_unsolicited_report_interval", + "net.ipv4.conf.default.ignore_routes_with_linkdown", + "net.ipv4.conf.default.log_martians", + "net.ipv4.conf.default.mc_forwarding", + "net.ipv4.conf.default.medium_id", + "net.ipv4.conf.default.promote_secondaries", + "net.ipv4.conf.default.proxy_arp", + "net.ipv4.conf.default.proxy_arp_pvlan", + "net.ipv4.conf.default.route_localnet", + "net.ipv4.conf.default.rp_filter", + "net.ipv4.conf.default.secure_redirects", + "net.ipv4.conf.default.send_redirects", + "net.ipv4.conf.default.shared_media", + "net.ipv4.conf.default.src_valid_mark", + "net.ipv4.conf.default.tag", + "net.ipv4.conf.default.ugc_tstamp", + "net.ipv4.conf.default.disable_xfrm", + "net.ipv4.conf.default.pim_rp_warn" + }, + "IPv4_eth0_Interface": { + "net.ipv4.conf.eth0.accept_local", + "net.ipv4.conf.eth0.accept_redirects", + "net.ipv4.conf.eth0.accept_source_route", + "net.ipv4.conf.eth0.arp_accept", + "net.ipv4.conf.eth0.arp_announce", + "net.ipv4.conf.eth0.arp_filter", + "net.ipv4.conf.eth0.arp_ignore", + "net.ipv4.conf.eth0.arp_notify", + "net.ipv4.conf.eth0.bc_forwarding", + "net.ipv4.conf.eth0.bootp_relay", + "net.ipv4.conf.eth0.disable_policy", + "net.ipv4.conf.eth0.drop_gratuitous_arp", + "net.ipv4.conf.eth0.drop_unicast_in_l2_multicast", + "net.ipv4.conf.eth0.force_igmp_version", + "net.ipv4.conf.eth0.forwarding", + "net.ipv4.conf.eth0.igmpv2_unsolicited_report_interval", + "net.ipv4.conf.eth0.igmpv3_unsolicited_report_interval", + "net.ipv4.conf.eth0.ignore_routes_with_linkdown", + "net.ipv4.conf.eth0.log_martians", + "net.ipv4.conf.eth0.mc_forwarding", + "net.ipv4.conf.eth0.medium_id", + "net.ipv4.conf.eth0.promote_secondaries", + "net.ipv4.conf.eth0.proxy_arp", + "net.ipv4.conf.eth0.proxy_arp_pvlan", + "net.ipv4.conf.eth0.route_localnet", + "net.ipv4.conf.eth0.rp_filter", + "net.ipv4.conf.eth0.secure_redirects", + "net.ipv4.conf.eth0.send_redirects", + "net.ipv4.conf.eth0.shared_media", + "net.ipv4.conf.eth0.src_valid_mark", + "net.ipv4.conf.eth0.tag", + "net.ipv4.conf.eth0.ugc_tstamp", + "net.ipv4.conf.eth0.disable_xfrm", + "net.ipv4.conf.eth0.pim_rp_warn" + }, + "IPv4_lo_Interface": { + "net.ipv4.conf.lo.accept_local", + "net.ipv4.conf.lo.accept_redirects", + "net.ipv4.conf.lo.accept_source_route", + "net.ipv4.conf.lo.arp_accept", + "net.ipv4.conf.lo.arp_announce", + "net.ipv4.conf.lo.arp_filter", + "net.ipv4.conf.lo.arp_ignore", + "net.ipv4.conf.lo.arp_notify", + "net.ipv4.conf.lo.bc_forwarding", + "net.ipv4.conf.lo.bootp_relay", + "net.ipv4.conf.lo.disable_policy", + "net.ipv4.conf.lo.drop_gratuitous_arp", + "net.ipv4.conf.lo.drop_unicast_in_l2_multicast", + "net.ipv4.conf.lo.force_igmp_version", + "net.ipv4.conf.lo.forwarding", + "net.ipv4.conf.lo.igmpv2_unsolicited_report_interval", + "net.ipv4.conf.lo.igmpv3_unsolicited_report_interval", + "net.ipv4.conf.lo.ignore_routes_with_linkdown", + "net.ipv4.conf.lo.log_martians", + "net.ipv4.conf.lo.mc_forwarding", + "net.ipv4.conf.lo.medium_id", + "net.ipv4.conf.lo.promote_secondaries", + "net.ipv4.conf.lo.proxy_arp", + "net.ipv4.conf.lo.proxy_arp_pvlan", + "net.ipv4.conf.lo.route_localnet", + "net.ipv4.conf.lo.rp_filter", + "net.ipv4.conf.lo.secure_redirects", + "net.ipv4.conf.lo.send_redirects", + "net.ipv4.conf.lo.shared_media", + "net.ipv4.conf.lo.src_valid_mark", + "net.ipv4.conf.lo.tag", + "net.ipv4.conf.lo.ugc_tstamp", + "net.ipv4.conf.lo.disable_xfrm", + "net.ipv4.conf.lo.pim_rp_warn" + } + }, + "IPv6": { + "IPv6_Global": { + "net.ipv6.conf.all.accept_dad", + "net.ipv6.conf.all.accept_ra", + "net.ipv6.conf.all.accept_ra_defrtr", + "net.ipv6.conf.all.accept_ra_from_local", + "net.ipv6.conf.all.accept_ra_min_hop_limit", + "net.ipv6.conf.all.accept_ra_mtu", + "net.ipv6.conf.all.accept_ra_pinfo", + "net.ipv6.conf.all.accept_ra_rt_info_max_plen", + "net.ipv6.conf.all.accept_ra_rt_info_min_plen", + "net.ipv6.conf.all.accept_ra_rtr_pref", + "net.ipv6.conf.all.accept_redirects", + "net.ipv6.conf.all.accept_source_route", + "net.ipv6.conf.all.addr_gen_mode", + "net.ipv6.conf.all.autoconf", + "net.ipv6.conf.all.dad_transmits", + "net.ipv6.conf.all.disable_ipv6", + "net.ipv6.conf.all.disable_policy", + "net.ipv6.conf.all.drop_unicast_in_l2_multicast", + "net.ipv6.conf.all.drop_unsolicited_na", + "net.ipv6.conf.all.enhanced_dad", + "net.ipv6.conf.all.force_mld_version", + "net.ipv6.conf.all.force_tllao", + "net.ipv6.conf.all.forwarding", + "net.ipv6.conf.all.hop_limit", + "net.ipv6.conf.all.ignore_routes_with_linkdown", + "net.ipv6.conf.all.keep_addr_on_down", + "net.ipv6.conf.all.max_addresses", + "net.ipv6.conf.all.max_desync_factor", + "net.ipv6.conf.all.mc_forwarding", + "net.ipv6.conf.all.mldv1_unsolicited_report_interval", + "net.ipv6.conf.all.mldv2_unsolicited_report_interval", + "net.ipv6.conf.all.mtu", + "net.ipv6.conf.all.ndisc_notify", + "net.ipv6.conf.all.ndisc_tclass", + "net.ipv6.conf.all.optimistic_dad", + "net.ipv6.conf.all.proxy_ndp", + "net.ipv6.conf.all.regen_max_retry", + "net.ipv6.conf.all.router_probe_interval", + "net.ipv6.conf.all.router_solicitation_delay", + "net.ipv6.conf.all.router_solicitation_interval", + "net.ipv6.conf.all.router_solicitation_max_interval", + "net.ipv6.conf.all.router_solicitations", + "net.ipv6.conf.all.seg6_enabled", + "net.ipv6.conf.all.suppress_frag_ndisc", + "net.ipv6.conf.all.temp_prefered_lft", + "net.ipv6.conf.all.temp_valid_lft", + "net.ipv6.conf.all.use_oif_addrs_only", + "net.ipv6.conf.all.use_optimistic", + "net.ipv6.conf.all.use_tempaddr" + }, + "IPv6_Default_Interface": { + "net.ipv6.conf.default.accept_dad", + "net.ipv6.conf.default.accept_ra", + "net.ipv6.conf.default.accept_ra_defrtr", + "net.ipv6.conf.default.accept_ra_from_local", + "net.ipv6.conf.default.accept_ra_min_hop_limit", + "net.ipv6.conf.default.accept_ra_mtu", + "net.ipv6.conf.default.accept_ra_pinfo", + "net.ipv6.conf.default.accept_ra_rt_info_max_plen", + "net.ipv6.conf.default.accept_ra_rt_info_min_plen", + "net.ipv6.conf.default.accept_ra_rtr_pref", + "net.ipv6.conf.default.accept_redirects", + "net.ipv6.conf.default.accept_source_route", + "net.ipv6.conf.default.addr_gen_mode", + "net.ipv6.conf.default.autoconf", + "net.ipv6.conf.default.dad_transmits", + "net.ipv6.conf.default.disable_ipv6", + "net.ipv6.conf.default.disable_policy", + "net.ipv6.conf.default.drop_unicast_in_l2_multicast", + "net.ipv6.conf.default.drop_unsolicited_na", + "net.ipv6.conf.default.enhanced_dad", + "net.ipv6.conf.default.force_mld_version", + "net.ipv6.conf.default.force_tllao", + "net.ipv6.conf.default.forwarding", + "net.ipv6.conf.default.hop_limit", + "net.ipv6.conf.default.ignore_routes_with_linkdown", + "net.ipv6.conf.default.keep_addr_on_down", + "net.ipv6.conf.default.max_addresses", + "net.ipv6.conf.default.max_desync_factor", + "net.ipv6.conf.default.mc_forwarding", + "net.ipv6.conf.default.mldv1_unsolicited_report_interval", + "net.ipv6.conf.default.mldv2_unsolicited_report_interval", + "net.ipv6.conf.default.mtu", + "net.ipv6.conf.default.ndisc_notify", + "net.ipv6.conf.default.ndisc_tclass", + "net.ipv6.conf.default.optimistic_dad", + "net.ipv6.conf.default.proxy_ndp", + "net.ipv6.conf.default.regen_max_retry", + "net.ipv6.conf.default.router_probe_interval", + "net.ipv6.conf.default.router_solicitation_delay", + "net.ipv6.conf.default.router_solicitation_interval", + "net.ipv6.conf.default.router_solicitation_max_interval", + "net.ipv6.conf.default.router_solicitations", + "net.ipv6.conf.default.seg6_enabled", + "net.ipv6.conf.default.suppress_frag_ndisc", + "net.ipv6.conf.default.temp_prefered_lft", + "net.ipv6.conf.default.temp_valid_lft", + "net.ipv6.conf.default.use_oif_addrs_only", + "net.ipv6.conf.default.use_optimistic", + "net.ipv6.conf.default.use_tempaddr" + }, + "IPv6_Specific_enp1s0_Interface": { + "net.ipv6.conf.enp1s0.accept_dad", + "net.ipv6.conf.enp1s0.accept_ra", + "net.ipv6.conf.enp1s0.accept_ra_defrtr", + "net.ipv6.conf.enp1s0.accept_ra_from_local", + "net.ipv6.conf.enp1s0.accept_ra_min_hop_limit", + "net.ipv6.conf.enp1s0.accept_ra_mtu", + "net.ipv6.conf.enp1s0.accept_ra_pinfo", + "net.ipv6.conf.enp1s0.accept_ra_rt_info_max_plen", + "net.ipv6.conf.enp1s0.accept_ra_rt_info_min_plen", + "net.ipv6.conf.enp1s0.accept_ra_rtr_pref", + "net.ipv6.conf.enp1s0.accept_redirects", + "net.ipv6.conf.enp1s0.accept_source_route", + "net.ipv6.conf.enp1s0.addr_gen_mode", + "net.ipv6.conf.enp1s0.autoconf", + "net.ipv6.conf.enp1s0.dad_transmits", + "net.ipv6.conf.enp1s0.disable_ipv6", + "net.ipv6.conf.enp1s0.disable_policy", + "net.ipv6.conf.enp1s0.drop_unicast_in_l2_multicast", + "net.ipv6.conf.enp1s0.drop_unsolicited_na", + "net.ipv6.conf.enp1s0.enhanced_dad", + "net.ipv6.conf.enp1s0.force_mld_version", + "net.ipv6.conf.enp1s0.force_tllao", + "net.ipv6.conf.enp1s0.forwarding", + "net.ipv6.conf.enp1s0.hop_limit", + "net.ipv6.conf.enp1s0.ignore_routes_with_linkdown", + "net.ipv6.conf.enp1s0.keep_addr_on_down", + "net.ipv6.conf.enp1s0.max_addresses", + "net.ipv6.conf.enp1s0.max_desync_factor", + "net.ipv6.conf.enp1s0.mc_forwarding", + "net.ipv6.conf.enp1s0.mldv1_unsolicited_report_interval", + "net.ipv6.conf.enp1s0.mldv2_unsolicited_report_interval", + "net.ipv6.conf.enp1s0.mtu", + "net.ipv6.conf.enp1s0.ndisc_notify", + "net.ipv6.conf.enp1s0.ndisc_tclass", + "net.ipv6.conf.enp1s0.optimistic_dad", + "net.ipv6.conf.enp1s0.proxy_ndp", + "net.ipv6.conf.enp1s0.regen_max_retry", + "net.ipv6.conf.enp1s0.router_probe_interval", + "net.ipv6.conf.enp1s0.router_solicitation_delay", + "net.ipv6.conf.enp1s0.router_solicitation_interval", + "net.ipv6.conf.enp1s0.router_solicitation_max_interval", + "net.ipv6.conf.enp1s0.router_solicitations", + "net.ipv6.conf.enp1s0.seg6_enabled", + "net.ipv6.conf.enp1s0.suppress_frag_ndisc", + "net.ipv6.conf.enp1s0.temp_prefered_lft", + "net.ipv6.conf.enp1s0.temp_valid_lft", + "net.ipv6.conf.enp1s0.use_oif_addrs_only", + "net.ipv6.conf.enp1s0.use_optimistic", + "net.ipv6.conf.enp1s0.use_tempaddr" + } + }, + "IPv6_Specific_lo_Interface": { + "net.ipv6.conf.lo.accept_dad", + "net.ipv6.conf.lo.accept_ra", + "net.ipv6.conf.lo.accept_ra_defrtr", + "net.ipv6.conf.lo.accept_ra_from_local", + "net.ipv6.conf.lo.accept_ra_min_hop_limit", + "net.ipv6.conf.lo.accept_ra_mtu", + "net.ipv6.conf.lo.accept_ra_pinfo", + "net.ipv6.conf.lo.accept_ra_rt_info_max_plen", + "net.ipv6.conf.lo.accept_ra_rt_info_min_plen", + "net.ipv6.conf.lo.accept_ra_rtr_pref", + "net.ipv6.conf.lo.accept_redirects", + "net.ipv6.conf.lo.accept_source_route", + "net.ipv6.conf.lo.addr_gen_mode", + "net.ipv6.conf.lo.autoconf", + "net.ipv6.conf.lo.dad_transmits", + "net.ipv6.conf.lo.disable_ipv6", + "net.ipv6.conf.lo.disable_policy", + "net.ipv6.conf.lo.drop_unicast_in_l2_multicast", + "net.ipv6.conf.lo.drop_unsolicited_na", + "net.ipv6.conf.lo.enhanced_dad", + "net.ipv6.conf.lo.force_mld_version", + "net.ipv6.conf.lo.force_tllao", + "net.ipv6.conf.lo.forwarding", + "net.ipv6.conf.lo.hop_limit", + "net.ipv6.conf.lo.ignore_routes_with_linkdown", + "net.ipv6.conf.lo.keep_addr_on_down", + "net.ipv6.conf.lo.max_addresses", + "net.ipv6.conf.lo.max_desync_factor", + "net.ipv6.conf.lo.mc_forwarding", + "net.ipv6.conf.lo.mldv1_unsolicited_report_interval", + "net.ipv6.conf.lo.mldv2_unsolicited_report_interval", + "net.ipv6.conf.lo.mtu", + "net.ipv6.conf.lo.ndisc_notify", + "net.ipv6.conf.lo.ndisc_tclass", + "net.ipv6.conf.lo.optimistic_dad", + "net.ipv6.conf.lo.proxy_ndp", + "net.ipv6.conf.lo.regen_max_retry", + "net.ipv6.conf.lo.router_probe_interval", + "net.ipv6.conf.lo.router_solicitation_delay", + "net.ipv6.conf.lo.router_solicitation_interval", + "net.ipv6.conf.lo.router_solicitation_max_interval", + "net.ipv6.conf.lo.router_solicitations", + "net.ipv6.conf.lo.seg6_enabled", + "net.ipv6.conf.lo.suppress_frag_ndisc", + "net.ipv6.conf.lo.temp_prefered_lft", + "net.ipv6.conf.lo.temp_valid_lft", + "net.ipv6.conf.lo.use_oif_addrs_only", + "net.ipv6.conf.lo.use_optimistic", + "net.ipv6.conf.lo.use_tempaddr" + }, + "IPv6_Specific_virbr0_Interface": { + "net.ipv6.conf.virbr0.accept_dad", + "net.ipv6.conf.virbr0.accept_ra", + "net.ipv6.conf.virbr0.accept_ra_defrtr", + "net.ipv6.conf.virbr0.accept_ra_from_local", + "net.ipv6.conf.virbr0.accept_ra_min_hop_limit", + "net.ipv6.conf.virbr0.accept_ra_mtu", + "net.ipv6.conf.virbr0.accept_ra_pinfo", + "net.ipv6.conf.virbr0.accept_ra_rt_info_max_plen", + "net.ipv6.conf.virbr0.accept_ra_rt_info_min_plen", + "net.ipv6.conf.virbr0.accept_ra_rtr_pref", + "net.ipv6.conf.virbr0.accept_redirects", + "net.ipv6.conf.virbr0.accept_source_route", + "net.ipv6.conf.virbr0.addr_gen_mode", + "net.ipv6.conf.virbr0.autoconf", + "net.ipv6.conf.virbr0.dad_transmits", + "net.ipv6.conf.virbr0.disable_ipv6", + "net.ipv6.conf.virbr0.disable_policy", + "net.ipv6.conf.virbr0.drop_unicast_in_l2_multicast", + "net.ipv6.conf.virbr0.drop_unsolicited_na", + "net.ipv6.conf.virbr0.enhanced_dad", + "net.ipv6.conf.virbr0.force_mld_version", + "net.ipv6.conf.virbr0.force_tllao", + "net.ipv6.conf.virbr0.forwarding", + "net.ipv6.conf.virbr0.hop_limit", + "net.ipv6.conf.virbr0.ignore_routes_with_linkdown", + "net.ipv6.conf.virbr0.keep_addr_on_down", + "net.ipv6.conf.virbr0.max_addresses", + "net.ipv6.conf.virbr0.max_desync_factor", + "net.ipv6.conf.virbr0.mc_forwarding", + "net.ipv6.conf.virbr0.mldv1_unsolicited_report_interval", + "net.ipv6.conf.virbr0.mldv2_unsolicited_report_interval", + "net.ipv6.conf.virbr0.mtu", + "net.ipv6.conf.virbr0.ndisc_notify", + "net.ipv6.conf.virbr0.ndisc_tclass", + "net.ipv6.conf.virbr0.optimistic_dad", + "net.ipv6.conf.virbr0.proxy_ndp", + "net.ipv6.conf.virbr0.regen_max_retry", + "net.ipv6.conf.virbr0.router_probe_interval", + "net.ipv6.conf.virbr0.router_solicitation_delay", + "net.ipv6.conf.virbr0.router_solicitation_interval", + "net.ipv6.conf.virbr0.router_solicitation_max_interval", + "net.ipv6.conf.virbr0.router_solicitations", + "net.ipv6.conf.virbr0.seg6_enabled", + "net.ipv6.conf.virbr0.suppress_frag_ndisc", + "net.ipv6.conf.virbr0.temp_valid_lft", + "net.ipv6.conf.virbr0.use_oif_addrs_only", + "net.ipv6.conf.virbr0.use_optimistic", + "net.ipv6.conf.virbr0.use_tempaddr" + }, + "IPv6_Multipath": { + "net.ipv6.fib_multipath_hash_fields", + "net.ipv6.fib_multipath_hash_policy" + }, + "IPv6_Flow_Label": { + "net.ipv6.flowlabel_consistency", + "net.ipv6.flowlabel_reflect", + "net.ipv6.flowlabel_state_ranges", + "net.ipv6.fwmark_reflect", + "net.ipv6.icmp.ratelimit", + "net.ipv6.idgen_delay", + "net.ipv6.idgen_retries" + }, + "IPv6_Fragmentation": { + "net.ipv6.ip6frag_high_thresh", + "net.ipv6.ip6frag_low_thresh", + "net.ipv6.ip6frag_secret_interval", + "net.ipv6.ip6frag_time", + "net.ipv6.ip_nonlocal_bind", + "net.ipv6.max_dst_opts_length", + "net.ipv6.max_dst_opts_number", + "net.ipv6.max_hbh_length", + "net.ipv6.max_hbh_opts_number", + "net.ipv6.mld_max_msf", + "net.ipv6.mld_qrv" + }, + "IPv6_Neighbor_Discovery_Default_Interface": { + "net.ipv6.neigh.default.anycast_delay", + "net.ipv6.neigh.default.app_solicit", + "net.ipv6.neigh.default.base_reachable_time_ms", + "net.ipv6.neigh.default.delay_first_probe_time", + "net.ipv6.neigh.default.gc_interval", + "net.ipv6.neigh.default.gc_stale_time", + "net.ipv6.neigh.default.gc_thresh1", + "net.ipv6.neigh.default.gc_thresh2", + "net.ipv6.neigh.default.gc_thresh3", + "net.ipv6.neigh.default.locktime", + "net.ipv6.neigh.default.mcast_resolicit", + "net.ipv6.neigh.default.mcast_solicit", + "net.ipv6.neigh.default.proxy_delay", + "net.ipv6.neigh.default.proxy_qlen", + "net.ipv6.neigh.default.retrans_time_ms", + "net.ipv6.neigh.default.ucast_solicit", + "net.ipv6.neigh.default.unres_qlen", + "net.ipv6.neigh.default.unres_qlen_bytes" + }, + "IPv6_Neighbor_Discovery_enp1s0_Interface": { + "net.ipv6.neigh.enp1s0.anycast_delay", + "net.ipv6.neigh.enp1s0.app_solicit", + "net.ipv6.neigh.enp1s0.base_reachable_time_ms", + "net.ipv6.neigh.enp1s0.delay_first_probe_time", + "net.ipv6.neigh.enp1s0.gc_stale_time", + "net.ipv6.neigh.enp1s0.locktime", + "net.ipv6.neigh.enp1s0.mcast_resolicit", + "net.ipv6.neigh.enp1s0.mcast_solicit", + "net.ipv6.neigh.enp1s0.proxy_delay", + "net.ipv6.neigh.enp1s0.proxy_qlen", + "net.ipv6.neigh.enp1s0.retrans_time_ms", + "net.ipv6.neigh.enp1s0.ucast_solicit", + "net.ipv6.neigh.enp1s0.unres_qlen", + "net.ipv6.neigh.enp1s0.unres_qlen_bytes" + }, + "IPv6_Neighbor_Discovery_lo_Interface": { + "net.ipv6.neigh.lo.anycast_delay", + "net.ipv6.neigh.lo.app_solicit", + "net.ipv6.neigh.lo.base_reachable_time_ms", + "net.ipv6.neigh.lo.delay_first_probe_time", + "net.ipv6.neigh.lo.gc_stale_time", + "net.ipv6.neigh.lo.locktime", + "net.ipv6.neigh.lo.mcast_resolicit", + "net.ipv6.neigh.lo.mcast_solicit", + "net.ipv6.neigh.lo.proxy_delay", + "net.ipv6.neigh.lo.proxy_qlen", + "net.ipv6.neigh.lo.retrans_time_ms", + "net.ipv6.neigh.lo.ucast_solicit", + "net.ipv6.neigh.lo.unres_qlen", + "net.ipv6.neigh.lo.unres_qlen_bytes" + }, + "IPv6_Neighbor_Discovery_virbr0_Interface": { + "net.ipv6.neigh.virbr0.anycast_delay", + "net.ipv6.neigh.virbr0.app_solicit", + "net.ipv6.neigh.virbr0.base_reachable_time_ms", + "net.ipv6.neigh.virbr0.delay_first_probe_time", + "net.ipv6.neigh.virbr0.gc_stale_time", + "net.ipv6.neigh.virbr0.locktime", + "net.ipv6.neigh.virbr0.mcast_resolicit", + "net.ipv6.neigh.virbr0.mcast_solicit", + "net.ipv6.neigh.virbr0.proxy_delay", + "net.ipv6.neigh.virbr0.proxy_qlen", + "net.ipv6.neigh.virbr0.retrans_time_ms", + "net.ipv6.neigh.virbr0.ucast_solicit", + "net.ipv6.neigh.virbr0.unres_qlen", + "net.ipv6.neigh.virbr0.unres_qlen_bytes", + "net.ipv6.route.gc_elasticity", + "net.ipv6.route.gc_interval", + "net.ipv6.route.gc_min_interval", + "net.ipv6.route.gc_min_interval_ms", + "net.ipv6.route.gc_thresh", + "net.ipv6.route.gc_timeout", + "net.ipv6.route.max_size", + "net.ipv6.route.min_adv_mss", + "net.ipv6.route.mtu_expires", + "net.ipv6.seg6_flowlabel", + "net.ipv6.xfrm6_gc_thresh" + }, + "MPTCP": { + "net.mptcp.add_addr_timeout", + "net.mptcp.enabled", + "net.mptcp.stale_loss_cnt" + }, + "Network_Connection_Tracking_Basic": { + "net.netfilter.nf_conntrack_acct", + "net.netfilter.nf_conntrack_buckets", + "net.netfilter.nf_conntrack_checksum", + "net.netfilter.nf_conntrack_count" + }, + "Network_Connection_Tracking_DCCP_Protocol": { + "net.netfilter.nf_conntrack_dccp_loose", + "net.netfilter.nf_conntrack_dccp_timeout_closereq", + "net.netfilter.nf_conntrack_dccp_timeout_closing", + "net.netfilter.nf_conntrack_dccp_timeout_open", + "net.netfilter.nf_conntrack_dccp_timeout_partopen", + "net.netfilter.nf_conntrack_dccp_timeout_request", + "net.netfilter.nf_conntrack_dccp_timeout_respond", + "net.netfilter.nf_conntrack_dccp_timeout_timewait" + }, + "Network_Connection_Tracking_Event_and_Expected_Connection": { + "net.netfilter.nf_conntrack_events", + "net.netfilter.nf_conntrack_expect_max" + }, + "Network_Connection_Tracking_IPv6_Fragment": { + "net.netfilter.nf_conntrack_frag6_high_thresh", + "net.netfilter.nf_conntrack_frag6_low_thresh", + "net.netfilter.nf_conntrack_frag6_timeout": + }, + "Network_Connection_Tracking_General_and_Protocol_Specific_Timeout": { + "net.netfilter.nf_conntrack_generic_timeout", + "net.netfilter.nf_conntrack_helper", + "net.netfilter.nf_conntrack_icmp_timeout", + "net.netfilter.nf_conntrack_icmpv6_timeout", + "net.netfilter.nf_conntrack_log_invalid", + "net.netfilter.nf_conntrack_max" + }, + "Network_Connection_Tracking_SCTP_Protocol_Timeout": { + "net.netfilter.nf_conntrack_sctp_timeout_closed", + "net.netfilter.nf_conntrack_sctp_timeout_cookie_echoed", + "net.netfilter.nf_conntrack_sctp_timeout_cookie_wait", + "net.netfilter.nf_conntrack_sctp_timeout_established", + "net.netfilter.nf_conntrack_sctp_timeout_heartbeat_acked", + "net.netfilter.nf_conntrack_sctp_timeout_heartbeat_sent", + "net.netfilter.nf_conntrack_sctp_timeout_shutdown_ack_sent", + "net.netfilter.nf_conntrack_sctp_timeout_shutdown_recd", + "net.netfilter.nf_conntrack_sctp_timeout_shutdown_sent" + }, + "Network_Connection_Tracking_TCP": { + "net.netfilter.nf_conntrack_tcp_be_liberal", + "net.netfilter.nf_conntrack_tcp_loose", + "net.netfilter.nf_conntrack_tcp_max_retrans", + "net.netfilter.nf_conntrack_tcp_timeout_close", + "net.netfilter.nf_conntrack_tcp_timeout_close_wait", + "net.netfilter.nf_conntrack_tcp_timeout_established", + "net.netfilter.nf_conntrack_tcp_timeout_fin_wait", + "net.netfilter.nf_conntrack_tcp_timeout_last_ack", + "net.netfilter.nf_conntrack_tcp_timeout_max_retrans", + "net.netfilter.nf_conntrack_tcp_timeout_syn_recv", + "net.netfilter.nf_conntrack_tcp_timeout_syn_sent", + "net.netfilter.nf_conntrack_tcp_timeout_time_wait", + "net.netfilter.nf_conntrack_tcp_timeout_unacknowledged", + "net.netfilter.nf_conntrack_timestamp", + "net.netfilter.nf_conntrack_udp_timeout", + "net.netfilter.nf_conntrack_udp_timeout_stream", + "net.netfilter.nf_flowtable_tcp_timeout", + "net.netfilter.nf_flowtable_udp_timeout" + }, + "Network_Connection_Tracking_Logging": { + "net.netfilter.nf_log.0", + "net.netfilter.nf_log.1", + "net.netfilter.nf_log.10", + "net.netfilter.nf_log.11", + "net.netfilter.nf_log.12", + "net.netfilter.nf_log.2", + "net.netfilter.nf_log.3", + "net.netfilter.nf_log.4", + "net.netfilter.nf_log.5", + "net.netfilter.nf_log.6", + "net.netfilter.nf_log.7", + "net.netfilter.nf_log.8", + "net.netfilter.nf_log.9", + "net.netfilter.nf_log_all_netns", + "net.nf_conntrack_max", + "net.unix.max_dgram_qlen" + } + }, + "Sun_RPC_Related_Parameters": { + "sunrpc.max_resvport", + "sunrpc.min_resvport", + "sunrpc.nfs_debug", + "sunrpc.nfsd_debug", + "sunrpc.nlm_debug", + "sunrpc.rpc_debug", + "sunrpc.tcp_fin_timeout", + "sunrpc.tcp_max_slot_table_entries", + "sunrpc.tcp_slot_table_entries", + "sunrpc.transports", + "sunrpc.udp_slot_table_entries" + }, + "User_Namespace_Related_Parameters": { + "user.max_cgroup_namespaces", + "user.max_inotify_instances", + "user.max_inotify_watches", + "user.max_ipc_namespaces", + "user.max_mnt_namespaces", + "user.max_net_namespaces", + "user.max_pid_namespaces", + "user.max_time_namespaces", + "user.max_user_namespaces", + "user.max_uts_namespaces", + "vm.admin_reserve_kbytes" + }, + "Memory_Management": { + "vm.block_dump", + "vm.compact_unevictable_allowed", + "vm.compaction_proactiveness", + "vm.dirty_background_bytes", + "vm.dirty_background_ratio", + "vm.dirty_bytes", + "vm.dirty_expire_centisecs", + "vm.dirty_ratio", + "vm.dirty_writeback_centisecs", + "vm.dirtytime_expire_seconds", + "vm.drop_caches", + "vm.extfrag_threshold", + "vm.force_cgroup_v2_swappiness", + "vm.hugetlb_shm_group", + "vm.laptop_mode", + "vm.legacy_va_layout", + "vm.lowmem_reserve_ratio", + "vm.max_map_count", + "vm.memory_failure_early_kill", + "vm.memory_failure_recovery", + "vm.min_free_kbytes", + "vm.min_slab_ratio", + "vm.min_unmapped_ratio", + "vm.mmap_min_addr", + "vm.mmap_rnd_bits", + "vm.mmap_rnd_compat_bits", + "vm.nr_hugepages", + "vm.nr_hugepages_mempolicy", + "vm.nr_overcommit_hugepages", + "vm.numa_stat", + "vm.numa_zonelist_order", + "vm.oom_dump_tasks", + "vm.oom_kill_allocating_task", + "vm.overcommit_kbytes", + "vm.overcommit_memory", + "vm.overcommit_ratio", + "vm.page-cluster", + "vm.page_lock_unfairness", + "vm.panic_on_oom", + "vm.percpu_pagelist_fraction", + "vm.stat_interval", + "vm.swappiness", + "vm.user_reserve_kbytes", + "vm.vfs_cache_pressure", + "vm.watermark_boost_factor", + "vm.watermark_scale_factor", + "vm.zone_reclaim_mode" + } +} \ No newline at end of file diff --git a/tools/multisystem_performance/src/clean_data.py b/tools/multisystem_performance/src/clean_data.py index ace1b8f..bb29277 100644 --- a/tools/multisystem_performance/src/clean_data.py +++ b/tools/multisystem_performance/src/clean_data.py @@ -33,7 +33,6 @@ def clean_files_with_prefix(directory, prefix): print(f"删除文件 {filename} 时出现错误:{e}") -# 使用示例 data_directory = "./data/" prefix_to_clean = ["differ-2023", "statistical-2023"] diff --git a/tools/multisystem_performance/src/clean_log.py b/tools/multisystem_performance/src/clean_log.py index a55cbbf..aa08459 100644 --- a/tools/multisystem_performance/src/clean_log.py +++ b/tools/multisystem_performance/src/clean_log.py @@ -33,7 +33,6 @@ def clean_files_with_prefix(directory, prefix): print(f"删除文件 {filename} 时出现错误:{e}") -# 使用示例 data_directory = "./log/" prefix_to_clean = ["get_sysctl_ulimit", "load_config"] diff --git a/tools/multisystem_performance/src/process_parameters.py b/tools/multisystem_performance/src/process_parameters.py index 77b4836..23a4cce 100644 --- a/tools/multisystem_performance/src/process_parameters.py +++ b/tools/multisystem_performance/src/process_parameters.py @@ -18,83 +18,141 @@ # @Desc : process parameters and save result to file # ############################################# -from get_parameters import * -from load_check import * +import os import json +import logging + +from get_parameters import run_command_and_save_by_mode, differ_sysctl_res, \ + PC1_VERSION, PC2_VERSION +from load_check import host_test_body, communication_test_body, timestamp + +SELECTED_MODE = None def process_parameters(): - logging.info('process_parameters.py start') + """ + 读取配置文件config.json后根据选择的测试模式执行测试连通性,封装了process_differ + """ + + logging.info('开始: process_parameters.py') with open('config/config.json') as f: data = json.load(f) # 选择测试模式 - selected_mode = input("host_test:1 \ncommunication_test):2\n请选择测试模式(1/2):\n") + global SELECTED_MODE + SELECTED_MODE = input("(1)host_test模式: 支持3台PC, (2)communication_test模式:支持2台PC. 请选择测试模式(1/2):") + logging.info(f'选择的测试模式为: {SELECTED_MODE}') - if selected_mode == '1': + if SELECTED_MODE == '1': host_test_body(data) - - if selected_mode == '2': + if SELECTED_MODE == '2': communication_test_body(data) - else: - print("无效的模式选择") + print("无效的模式选择,请重新运行程序") exit(1) - logging.info('get_parameters.py start') - os_version = get_os_version() - - sysctl_res_file_name = "sysctl@" + os_version + ".txt" - ulimit_res_file_name = "ulimit@" + os_version + ".txt" - save_difflib_res = f"differ-{timestamp}.txt" - save_statistical_res = f"statistical-{timestamp}.txt" - # 统计比较结果:列表格式 - file2lack = [] - file2modify = [] - file2add = [] - file1 = "" - file2 = "" - - logging.info( - "sysctl_res_file_name = \'%s\',ulimit_res_file_name = \'%s\',save_difflib_res = \'%s\',save_statistical_res = " - "\'%s\' ", - sysctl_res_file_name, ulimit_res_file_name, save_difflib_res, save_statistical_res, - extra={'logfile': log_file}) - - run_command_save(sysctl_res_file_name, ulimit_res_file_name) - - use_differ_res(os_version, sysctl_res_file_name, save_difflib_res) - - # 读取比较结果文件 - with open("./data/" + save_difflib_res) as f: - lines = f.readlines() - - for i, line in enumerate(lines): - if line.startswith('-'): - if lines[i + 2].startswith('-') or lines[i + 2].startswith(' '): - file2lack.append(line.strip()) - elif lines[i + 2].startswith('+'): - file2modify.append(line.strip()) - elif lines[i + 2].startswith('?'): - if lines[i + 4].startswith('+') and lines[i + 6].startswith('?'): - file2modify.append(line.strip()) - elif line.startswith('+'): - file2add.append(line.strip()) - + process_differ(data) + + +def process_differ(data): + """ + 读取比较结果文件,统计比较结果,并保存到文件 + 封装了 run_command_and_save_by_mode 和 differ_sysctl_res 两个函数 + data: 读取的配置文件config.json + """ + + file2_lack = [] + file2_modify = [] + file2_new = [] # 统计比较结果:列表格式 + save_differ_sysctl_res = f'differ-{timestamp}.txt' # 保存比较结果的文件名, 参数会被传递到differ_sysctl_res 函数 + save_statistical_res = f'statistical-{timestamp}.txt' # 保存统计结果的文件名, 参数会被传递到statistical_res 函数 + + ''' + 根据测试模式选择运行命令 + host 模式: PC1 与 PC2 的 4 个文件 + communication 模式: local 与 remote 的 4 个文件 + 格式: local_file = f'./data/{cmd}@{os_version}-{timestamp}.txt' 应该不会冲突 + ''' + run_command_and_save_by_mode(SELECTED_MODE, data) + + ''' + 根据测试模式进行 differ 比较 + host 模式: 比较 PC1 与 PC2 的 sysctl + communication 模式: 比较 local 与 remote 的 sysctl + 根据 timestamp 避免文件冲突 + ''' + differ_sysctl_res(SELECTED_MODE, save_differ_sysctl_res) + + # 读取比较结果文件 save_differ_sysctl_res + try: + with open(f'./data/{save_differ_sysctl_res}') as f: + logging.info(f'./data/{save_differ_sysctl_res} as f ') + lines = f.readlines() + except FileNotFoundError as e: + logging.info(f'{e}file not found') + + for i, line in enumerate(lines): + if line.startswith('-'): + if lines[i + 2].startswith('-') or lines[i + 2].startswith(' '): + file2_lack.append(line.strip()) + elif lines[i + 2].startswith('+'): + file2_modify.append(line.strip()) + elif lines[i + 2].startswith('?'): + if lines[i + 4].startswith('+') and lines[i + 6].startswith('?'): + file2_modify.append(line.strip()) + elif line.startswith('+'): + file2_new.append(line.strip()) + + logging.info(f'file2_lack: {file2_lack}') + logging.info(f'file2_new: {file2_new}') + logging.info(f'file2_modify: {file2_modify}') # 统计比较结果:字典格式 file2lack_dict = {line.strip('-+ \n').split('=', 1)[0]: line.strip('-+ \n').split('=', 1)[1].strip() for line in - file2lack} + file2_lack} file2add_dict = {line.strip('-+ \n').split('=', 1)[0]: line.strip('-+ \n').split('=', 1)[1].strip() for line in - file2add} + file2_new} file2modify_dict = {line.strip('-+ \n').split('=', 1)[0]: line.strip('-+ \n').split('=', 1)[1].strip() for line in - file2modify} + file2_modify} # 打印统计结果 - print("file1: " + file1 + ", file2: " + file2 + " 统计结果为:") - print("file2 缺失的行有: " + str(len(file2lack)) + "行") - print("file2 增加的行有: " + str(len(file2add)) + "行") - print("file2 修改的行有: " + str(len(file2modify)) + "行") - - # 在原来的代码末尾,添加调用保存结果到文件的函数 - analyse_result_to_file(file2lack_dict, file2add_dict, file2modify_dict, file1, file2, file2lack, file2add, - file2modify, save_statistical_res) + print(f'file1:"./data/sysctl@{PC1_VERSION}-{timestamp}.txt", file2:"./data/sysctl@{PC2_VERSION}-{timestamp}.txt",' + f'统计结果为: ') + print("file2 缺失的行有: " + str(len(file2lack_dict)) + "行") + logging.info(f'file2 缺失的行有: {str(len(file2lack_dict))}行') + print("file2 增加的行有: " + str(len(file2add_dict)) + "行") + logging.info(f'file2 增加的行有: {str(len(file2add_dict))}行') + print("file2 修改的行有: " + str(len(file2modify_dict)) + "行") + logging.info(f'file2 修改的行有: {str(len(file2modify_dict))}行') + + result_str = "" + result_str += "file1 与 file2 的比较统计结果为:\n" + result_str += "file2 缺失的行有: " + str(len(file2_lack)) + "行\n" + result_str += "file2 增加的行有: " + str(len(file2_new)) + "行\n" + result_str += "file2 修改的行有: " + str(len(file2_modify)) + "行\n" + result_str += "====================================================================\n" + result_str += "file2 缺失的行有:\n" + for k, v in file2lack_dict.items(): + result_str += k + " " + v + "\n" + result_str += "====================================================================\n" + result_str += "file2 增加的行有:\n" + for k, v in file2add_dict.items(): + result_str += k + " " + v + "\n" + result_str += "====================================================================\n" + result_str += "file2 修改的行有:\n" + for k, v in file2modify_dict.items(): + result_str += k + " " + v + "\n" + + # 保存统计结果到文件 + try: + with open(f'./data/{save_statistical_res}', "w") as file: + file.write(result_str) + os.chmod(f'./data/{save_statistical_res}', 0o644) + print(f'成功:统计结果已成功保存到文件:{save_statistical_res}') + logging.info(f'成功:统计结果已成功保存到文件:./data/{save_statistical_res}') + except IOError: + print("失败:保存文件时出现错误,请检查路径和文件权限,查阅日志获得更多信息") + logging.error(f'IOError:保存文件时出现错误,请检查路径和文件权限,查阅日志获得更多信息') + + +def get_mode(): + return SELECTED_MODE diff --git a/tools/multisystem_performance/src/run_benchmark.py b/tools/multisystem_performance/src/run_benchmark.py new file mode 100644 index 0000000..2378437 --- /dev/null +++ b/tools/multisystem_performance/src/run_benchmark.py @@ -0,0 +1,139 @@ +#!/usr/bin/bash + +# Copyright (c) 2022 Huawei Technologies Co., Ltd. +# A-Tune is licensed under the Mulan PSL v2. +# You can use this software according to the terms and conditions of the Mulan PSL v2. +# You may obtain a copy of Mulan PSL v2 at: +# http://license.coscl.org.cn/MulanPSL2 +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR +# PURPOSE. +# See the Mulan PSL v2 for more details. + +# ############################################# +# @Author : westtide +# @Contact : tocokeo@outlook.com +# @Date : 2023/10/7 +# @License : Mulan PSL v2 +# @Desc : run benchmark of memory, cpu, disk, net +# ############################################# + +import os +import json +import logging +import subprocess +import paramiko +import getpass + +from process_parameters import get_mode +from load_check import timestamp + + +def all_test(): + command = "cd ./tools/byte-unixbench/UnixBench && " + cmd = ['cd', './tools/byte-unixbench/UnixBench', '&&', './Run'] + print(f'开始执行memory,cpu,disk测试, 请稍等...') + logging.info(f'开始:memory,cpu and disk 测试') + try: + file_path = f'./data/UnixBench_res_output-{timestamp}.txt' + with open(file_path, "w") as output_file: + process = subprocess.Popen(cmd, stdout=output_file, stderr=output_file) + os.chmod(file_path, 0o644) + print(f"性能测试完成, UnixBench_res_output.txt 文件已生成, 请查看{file_path}") + logging.info(f'性能测试完成: file_path = {file_path}') + except Exception as e: + print(f"性能测试执行失败:{e}, 请检查日志以获得更多信息") + logging.error(f"性能测试执行失败:{e}, 请检查日志以获得更多信息") + + +def tcp_test(ip): + cmd = ['netperf', '-H', f'{ip}', '-p','12865', '-l', '60'] + print("开始执行网络测试: TCP 吞吐量, 预计 60s......") + logging.info(f'开始执行网络测试: TCP 吞吐量,TCP Test: cmd = {cmd}') + try: + process = subprocess.run(cmd, check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + print(f'TCP 测试结果为: {process.stdout.decode()}') + logging.info(f'TCP 测试结果 = {process.stdout.decode()}') + logging.info(f'TCP Test: {cmd} 执行成功') + except subprocess.CalledProcessError as e: + print(f"网络测试执行失败:{e}") + logging.error(f'TCP Test: {cmd} 执行失败') + except Exception as ex: + print(f"发生未知错误:{ex}") + logging.error(f'TCP Test: {cmd} 执行失败') + + +def net_test(): + if get_mode() == '1': + print( + "host_test模式: 在 local 上进行 PC1 与 PC2 的交叉验证测试, 将在 PC1 上进行性能测试, 请确保各自项目目录下工具安装正确") + logging.info(f'开始:net 测试') + with open(f'./config/config.json', 'r') as f: + config = json.load(f) + pc1_ip = config["host_test"]["pc1"]["ip"] + pc1_user = config["host_test"]["pc1"]["user"] + pc2_ip = config["host_test"]["pc2"]["ip"] + + tcp_test(pc1_ip) + + try: + ssh_client = paramiko.SSHClient() + ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + getpassword = getpass.getpass(f"请输入{pc1_user}@{pc1_ip}密码:") + logging.info(f'输入{pc1_user}@{pc1_ip}密码:******') + ssh_client.connect(pc1_ip, username=pc1_user, password=getpassword) + + netperf_command = f"netperf -H {pc2_ip} -p 12865 -l 60" + stdin, stdout, stderr = ssh_client.exec_command(netperf_command) + logging.info(f'{stdout}') + for line in stdout: + print(line.strip()) + ssh_client.close() + except paramiko.AuthenticationException: + print("SSH 认证失败,请检查用户名和密码") + logging.info(f'SSH 认证失败,请检查用户名和密码 {pc1_user}@{pc1_ip}') + except paramiko.SSHException as e: + print(f"SSH 连接错误: {str(e)}") + logging.info(f'SSH 连接错误: {str(e)}') + except Exception as ex: + print(f"发生未知错误: {str(ex)}") + logging.info(f'发生未知错误: {str(ex)}') + + if get_mode() == '2': + logging.info(f'开始:net 测试') + file_path = f'./config/config.json' + with open(file_path, 'r') as f: + config = json.load(f) + pc2_ip = config["communication_test"]["remote"]["ip"] + logging.info(f'pc2_ip = {pc2_ip}') + + tcp_test(pc2_ip) + + print('结束:net 测试') + logging.info(f'结束:net 测试') + + +def benchmark(): + logging.info(f'开始:benchmark 测试') + print("请选择测试类型:(1):memory,cpu and disk (2):net (3):all") + test_type = input() + logging.info(f'输入: test_type={test_type}') + if test_type == '1': + logging.info(f'开始:test_type {test_type}: memory,cpu and disk') + all_test() + logging.info(f'结束:{test_type} test') + + elif test_type == '2': + logging.info(f'开始:test_type {test_type}: net') + net_test() + logging.info(f'结束:{test_type} test') + + elif test_type == '3': + logging.info(f'开始:test_type {test_type}: all') + all_test() + net_test() + logging.info(f'结束:{test_type} test ') + + else: + print(f'输入错误, 请重新输入') + logging.error(f'输入错误, 请重新输入') diff --git a/tools/multisystem_performance/tests/test_get_parameters.py b/tools/multisystem_performance/tests/test_get_parameters.py new file mode 100644 index 0000000..932e356 --- /dev/null +++ b/tools/multisystem_performance/tests/test_get_parameters.py @@ -0,0 +1,116 @@ +#!/usr/bin/bash + +# Copyright (c) 2022 Huawei Technologies Co., Ltd. +# A-Tune is licensed under the Mulan PSL v2. +# You can use this software according to the terms and conditions of the Mulan PSL v2. +# You may obtain a copy of Mulan PSL v2 at: +# http://license.coscl.org.cn/MulanPSL2 +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR +# PURPOSE. +# See the Mulan PSL v2 for more details. + +# ############################################# +# @Author : westtide +# @Contact : tocokeo@outlook.com +# @Date : 2023/10/7 +# @License : Mulan PSL v2 +# @Desc : test for get_parameters.py +# ############################################# +# run 'pytest -p no:logging ./tests/test_get_parameters.py' under 'multisystem_performance' + +import os +import sys +import pytest +import logging +import subprocess + +sys.path.append("..") + +from unittest.mock import patch, Mock +from tools.multisystem_performance.src.get_parameters import get_os_version, run_command_and_save_result + +logging.info('开始: test_get_parameters.py') + + +def test_get_os_version_exists(): + """ + 创建一个虚拟的os-release文件 + tmp_path: 在测试过程中创建临时目录 + """ + # 调用函数并检查返回值 + result = get_os_version() + output = subprocess.run('cat /etc/os-release', stdout=subprocess.PIPE, stderr=subprocess.PIPE) + output_text = output.stdout.decode('utf-8').strip('\n') + if 'openEuler' in output_text: + assert result == 'openEuler' + elif 'CentOS' in output_text: + assert result == 'CentOS' + else: + assert result == 'Unknown' + + +@pytest.fixture +def test_get_os_version_subprocess_run_error(caplog, monkeypatch): + """ + test_get_os_version_subprocess_run_error: 测试subprocess.run()抛出异常的情况 + caplog: 用于捕获日志 + monkeypatch: 用于模拟subprocess.run()抛出异常 + """ + + def mock_subprocess_run(*args, **kwargs): + raise Exception("Subprocess error") + + # 模拟subprocess.run()抛出异常 + monkeypatch.setattr(subprocess, 'run', mock_subprocess_run) + result = get_os_version() + # 断言返回值和日志消息 + assert result == 'Unknown' + assert "Subprocess error" in caplog.text + assert "failed: 'cat /etc/os-release',linux_version = Unknown" in caplog.text + + +@pytest.fixture +def temp_file(tmpdir): + # 创建临时文件并返回其路径 + temp_file_path = os.path.join(tmpdir, "temp_output.txt") + yield temp_file_path + # 清理临时文件 + if os.path.exists(temp_file_path): + os.remove(temp_file_path) + + +@pytest.fixture +def mock_subprocess(): + with patch('subprocess.Popen') as mock_popen: + yield mock_popen + + +def test_run_command_and_save_result(mock_subprocess): + # 模拟 subprocess.Popen 对象和 communicate 方法的行为 + mock_popen = mock_subprocess.return_value + process_mock = Mock(returncode=0) + communicate_mock = Mock() + communicate_mock.return_value = (b'Command output', b'Command error') + mock_popen.communicate = communicate_mock + mock_popen.returncode = process_mock + + cmd = "echo 'test'" + file_dir = "test_output.txt" + + # 调用被测试的函数 + run_command_and_save_result(cmd, file_dir) + + # 断言命令是否以 shell=True 启动 + mock_subprocess.assert_called_with(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + + # 断言 communicate 方法被调用 + assert communicate_mock.called + + # 断言文件是否被成功保存 + with open(file_dir, 'r') as file: + content = file.read() + assert content == 'Command output' + + # 断言命令的返回码是否为 0 + assert process_mock.returncode == 0 diff --git a/tools/multisystem_performance/tests/test_process_parameters.py b/tools/multisystem_performance/tests/test_process_parameters.py new file mode 100644 index 0000000..bfbc5f8 --- /dev/null +++ b/tools/multisystem_performance/tests/test_process_parameters.py @@ -0,0 +1,64 @@ +#!/usr/bin/bash + +# Copyright (c) 2022 Huawei Technologies Co., Ltd. +# A-Tune is licensed under the Mulan PSL v2. +# You can use this software according to the terms and conditions of the Mulan PSL v2. +# You may obtain a copy of Mulan PSL v2 at: +# http://license.coscl.org.cn/MulanPSL2 +# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR +# PURPOSE. +# See the Mulan PSL v2 for more details. + +# ############################################# +# @Author : westtide +# @Contact : tocokeo@outlook.com +# @Date : 2023/10/7 +# @License : Mulan PSL v2 +# @Desc : test for process_parameters.py +# ############################################# +# run 'pytest -p no:logging ./tests/test_process_parameters.py' under 'multisystem_performance' + +import sys +import logging +import builtins + + +import pytest + +sys.path.append("..") +from tools.multisystem_performance.src.process_parameters import process_parameters, process_differ + +logging.info('开始: test_process_parameters.py') + + +@pytest.fixture +def sample_differ_file_content(): + str = """- Line 1 +- Line 2 + Line 3 ++ Line 4 +- Line 5 ++ Line 6 ++ Line 7 +- Line 8 ++ Line 9 + Line 10""" + return str + + +def open_mock(filename): + return filename + + +def test_process_differ_file_processing(sample_differ_file_content, monkeypatch): + # 使用 monkeypatch 来模拟内置的 open 函数 + monkeypatch.setattr(builtins, 'open', open_mock) + + # 调用 process_differ 函数 + file2_lack, file2_modify, file2_new = process_differ(None) + + # 检查结果 + assert file2_lack == ["Line 1", "Line 2", "Line 8"] + assert file2_modify == ["Line 6", "Line 9"] + assert file2_new == ["Line 4", "Line 7"] -- Gitee