perfkitbenchmarker/flags.py (498 lines of code) (raw):

# Copyright 2023 PerfKitBenchmarker Authors. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """File used for the management of PKB flags.""" import getpass from absl import flags MAX_RUN_URI_LENGTH = 12 FLAGS = flags.FLAGS def GetCurrentUser(): """Get the current user name. On some systems the current user information may be unavailable. In these cases we just need a string to tag the created resources with. It should not be a fatal error. Returns: User name OR default string if user name not available. """ try: return getpass.getuser() except KeyError: return 'user_unknown' flags.DEFINE_boolean( 'accept_licenses', False, 'Acknowledge that PKB may install software thereby accepting license' ' agreements on the users behalf.', ) flags.DEFINE_list('ssh_options', [], 'Additional options to pass to ssh.') flags.DEFINE_boolean('use_ipv6', False, 'Whether to use ipv6 for ssh/scp.') flags.DEFINE_list( 'benchmarks', ['cluster_boot'], 'Benchmarks and/or benchmark sets that should be run. The ' 'default is cluster_boot. For more information about ' 'benchmarks and benchmark sets, see the README and ' 'benchmark_sets.py.', ) flags.DEFINE_boolean( 'multi_os_benchmark', False, 'Whether is benchmark will involve multiple os types.', ) flags.DEFINE_string( 'archive_bucket', None, 'Archive results to the given S3/GCS bucket.' 'Must include gs:// or s3:// prefix.', ) flags.DEFINE_string( 'project', None, 'GCP project ID under which to create the virtual machines' ) flags.DEFINE_multi_string( 'zone', [], 'Similar to the --zones flag, but allows the flag to be specified ' 'multiple times on the commandline. For example, --zone=a --zone=b is ' 'equivalent to --zones=a,b. Furthermore, any values specified by --zone ' 'will be appended to those specified by --zones.', ) flags.DEFINE_list( 'zones', [], 'A list of zones within which to run PerfKitBenchmarker. ' 'This is specific to the cloud provider you are running on. ' 'If multiple zones are given, PerfKitBenchmarker will create 1 VM in ' 'zone, until enough VMs are created as specified in each ' 'benchmark. The order in which this flag is applied to VMs is ' 'undefined.', ) flags.DEFINE_list( 'extra_zones', [], 'Zones that will be appended to the "zones" list. This is functionally ' 'the same, but allows flag matrices to have two zone axes.', ) # TODO(user): note that this is currently very GCE specific. Need to create a # module which can translate from some generic types to provider specific # nomenclature. flags.DEFINE_string( 'machine_type', None, 'Machine ' "types that will be created for benchmarks that don't " 'require a particular type.', ) flags.DEFINE_integer( 'num_vms', 1, 'For benchmarks which can make use of a ' 'variable number of machines, the number of VMs to use.', ) flags.DEFINE_string( 'image', None, 'Default image that will be linked to the VM' ) flags.DEFINE_string( 'run_uri', None, 'Name of the Run. If provided, this ' 'should be alphanumeric and less than or equal to %d ' 'characters in length.' % MAX_RUN_URI_LENGTH, ) flags.DEFINE_boolean( 'use_pkb_logging', True, 'Whether to use PKB-specific ' 'logging handlers. Disabling this will use the standard ' 'ABSL logging directly.', ) flags.DEFINE_boolean( 'log_dmesg', False, 'Whether to log dmesg from ' 'each VM to the PKB log file before the VM is deleted.', ) flags.DEFINE_boolean( 'always_teardown_on_exception', False, 'Whether to tear ' 'down VMs when there is exception during the PKB run. If' 'enabled, VMs will be torn down even if FLAGS.run_stage ' 'does not specify teardown.', ) RESTORE_PATH = flags.DEFINE_string( 'restore', None, 'Path to restore resources from.' ) FREEZE_PATH = flags.DEFINE_string( 'freeze', None, 'Path to freeze resources to.' ) COLLECT_MEMINFO = flags.DEFINE_bool( 'collect_meminfo', False, 'Whether to collect /proc/meminfo stats.' ) OWNER = flags.DEFINE_string( 'owner', GetCurrentUser(), 'Owner name. Used to tag created resources and performance records.', ) flags.DEFINE_integer( 'duration_in_seconds', None, 'duration of benchmarks. (only valid for mesh_benchmark)', ) flags.DEFINE_string( 'static_vm_file', None, 'The file path for the Static Machine file. See ' 'static_virtual_machine.py for a description of this file.', ) flags.DEFINE_boolean( 'version', False, 'Display the version and exit.', allow_override_cpp=True ) flags.DEFINE_boolean('time_commands', False, 'Times each command issued.') flags.DEFINE_string( 'data_disk_type', None, 'Type for all data disks. If a provider keeps the operating system and ' 'user data on separate disks, this only affects the user data disk(s).' 'If the provider has OS and user data on the same disk, this flag affects' 'that disk.', ) flags.DEFINE_integer('data_disk_size', None, 'Size, in gb, for all data disks.') flags.DEFINE_integer( 'num_striped_disks', None, 'The number of data disks for PKB to create and stripe together into a ' 'single RAID 0 device. This defaults to 1, which means no striping. If ' 'data disks are local this is simply the number of existing disks you ' 'would like to combine. If data disks are provisioned remote disks, PKB ' 'will create this many disks and stripe them together. You do not need to ' 'set vm_group.disk_count. If you do set both vm_group.disk_count=m and ' 'num_striped_disks=n, you will end up with m logical disks striped out of ' 'm x n remote disks, which is probably not what you want.', lower_bound=1, ) flags.DEFINE_integer( 'num_partitions', None, 'The number of partitions to created from each disk. So far it is only ' 'supported on Linux.', lower_bound=1, ) flags.DEFINE_string( 'partition_size', None, 'The size of the partitions to create from each disk, e.g. 100M, 500G. ' 'Note that this is only supported on Linux so far.', ) flags.DEFINE_bool( 'install_packages', None, 'Override for determining whether packages should be ' 'installed. If this is false, no packages will be installed ' 'on any VMs. This option should probably only ever be used ' 'if you have already created an image with all relevant ' 'packages installed.', ) flags.DEFINE_bool( 'stop_after_benchmark_failure', False, 'Determines response when running multiple benchmarks serially and a ' 'benchmark run fails. When True, no further benchmarks are scheduled, and ' 'execution ends. When False, benchmarks continue to be scheduled. Does not ' 'apply to keyboard interrupts, which will always prevent further ' 'benchmarks from being scheduled.', ) flags.DEFINE_boolean( 'ignore_package_requirements', False, 'Disables Python package requirement runtime checks.', ) flags.DEFINE_boolean( 'publish_after_run', False, 'If true, PKB will publish all samples available immediately after running ' 'each benchmark. This may be useful in scenarios where the PKB run time ' 'for all benchmarks is much greater than a single benchmark.', ) flags.DEFINE_integer( 'publish_period', None, 'The period in seconds to publish samples from repeated run stages. ' 'This will only publish samples if publish_after_run is True.', ) flags.DEFINE_integer( 'run_stage_time', 0, 'PKB will run/re-run the run stage of each benchmark until it has spent ' 'at least this many seconds. It defaults to 0, so benchmarks will only ' 'be run once unless some other value is specified. This flag and ' 'run_stage_iterations are mutually exclusive.', ) flags.DEFINE_integer( 'run_stage_iterations', 1, 'PKB will run/re-run the run stage of each benchmark this many times. ' 'It defaults to 1, so benchmarks will only be run once unless some other ' 'value is specified. This flag and run_stage_time are mutually exclusive.', ) flags.DEFINE_integer( 'run_stage_retries', 0, 'The number of allowable consecutive failures during the run stage. After ' 'this number of failures any exceptions will cause benchmark termination. ' 'If run_stage_time is exceeded, the run stage will not be retried even if ' 'the number of failures is less than the value of this flag.', ) MAX_RETRIES = flags.DEFINE_integer( 'retries', 0, 'The amount of times PKB should retry each benchmark.' 'Use with --retry_substatuses to specify which failure substatuses to ' 'retry on. Defaults to all valid substatuses.', ) RETRY_DELAY_SECONDS = flags.DEFINE_integer( 'retry_delay_seconds', 0, 'The time to wait in between retries.' ) # Retries could also allow for a dict of failed_substatus: 'zone'|'region' # retry method which would make the retry functionality more customizable. SMART_QUOTA_RETRY = flags.DEFINE_bool( 'smart_quota_retry', False, 'If True, causes the benchmark to rerun in a zone in a different region ' 'in the same geo on a quota exception. Currently only works for benchmarks ' 'that specify a single zone (via --zone or --zones). The zone is selected ' 'at random and overrides the --zones flag or the --zone flag, depending on ' 'which is provided. QUOTA_EXCEEDED must be in the list of retry ' 'substatuses for this to work.', ) SMART_CAPACITY_RETRY = flags.DEFINE_bool( 'smart_capacity_retry', False, 'If True, causes the benchmark to rerun in a different zone in the same ' 'region on a capacity/config exception. Currently only works for ' 'benchmarks that specify a single zone (via --zone or --zones). The zone ' 'is selected at random and overrides the --zones flag or the --zone flag, ' 'depending on which is provided. INSUFFICIENT_CAPACITY and UNSUPPORTED ' 'must be in the list of retry substatuses for this to work.', ) flags.DEFINE_boolean( 'boot_samples', False, 'Whether to publish boot time samples for all tests.' ) MEASURE_DELETE = flags.DEFINE_boolean( 'collect_delete_samples', False, 'Whether to publish delete time samples for all tests.', ) flags.DEFINE_boolean( 'gpu_samples', False, 'Whether to publish GPU memcpy bandwidth samples for GPU tests.', ) flags.DEFINE_integer( 'run_processes', None, 'The number of parallel processes to use to run benchmarks.', lower_bound=1, ) flags.DEFINE_float( 'run_processes_delay', None, "The delay in seconds between parallel processes' invocation. " 'Increasing this value may reduce provider throttling issues.', lower_bound=0, ) flags.DEFINE_string( 'completion_status_file', None, 'If specified, this file will contain the completion status of each ' 'benchmark that ran (SUCCEEDED, FAILED, or SKIPPED). The file has one json ' 'object per line, each with the following format:\n' '{ "name": <benchmark name>, "flags": <flags dictionary>, ' '"status": <completion status> }', ) flags.DEFINE_string( 'helpmatch', '', 'Shows only flags defined in a module whose name matches the given regex.', allow_override_cpp=True, ) flags.DEFINE_string( 'helpmatchmd', '', 'helpmatch query with markdown friendly output. ' 'Shows only flags defined in a module whose name matches the given regex.', allow_override_cpp=True, ) flags.DEFINE_boolean( 'create_failed_run_samples', False, 'If true, PKB will create a sample specifying that a run stage failed. ' 'This sample will include metadata specifying the run stage that ' 'failed, the exception that occurred, as well as all the flags that ' 'were provided to PKB on the command line.', ) CREATE_STARTED_RUN_SAMPLE = flags.DEFINE_boolean( 'create_started_run_sample', False, 'Whether PKB will create a sample at the start of the provision phase of ' 'the benchmark run.', ) CREATE_STARTED_STAGE_SAMPLES = flags.DEFINE_boolean( 'create_started_stage_samples', False, 'Whether PKB will create a sample at the start of the each stage of ' 'the benchmark run.', ) flags.DEFINE_integer( 'failed_run_samples_error_length', 10240, 'If create_failed_run_samples is true, PKB will truncate any error ' 'messages at failed_run_samples_error_length.', ) flags.DEFINE_boolean( 'dry_run', False, 'If true, PKB will print the flags configurations to be run and exit. ' 'The configurations are generated from the command line flags, the ' 'flag_matrix, and flag_zip.', ) flags.DEFINE_string( 'skip_pending_runs_file', None, 'If file exists, any pending runs will be not be executed.', ) flags.DEFINE_boolean('use_vpn', False, 'Creates VPN tunnels between vm_groups') flags.DEFINE_integer( 'after_prepare_sleep_time', 0, 'The time in seconds to sleep after the prepare phase. This can be useful ' 'for letting burst tokens accumulate.', ) BETWEEN_RUNS_SLEEP_TIME = flags.DEFINE_integer( 'between_runs_sleep_time', 0, 'The time in seconds to sleep between runs.', ) flags.DEFINE_integer( 'after_run_sleep_time', 0, 'The time in seconds to sleep after the run phase. This can be useful ' 'for letting the VM sit idle after the bechmarking phase is complete.', ) flags.DEFINE_bool( 'before_run_pause', False, 'If true, wait for command line input before executing the run phase. ' 'This is useful for debugging benchmarks during development.', ) flags.DEFINE_bool( 'before_cleanup_pause', False, 'If true, wait for command line input before executing the cleanup phase. ' 'This is useful for debugging benchmarks during development.', ) flags.DEFINE_integer( 'timeout_minutes', 240, 'An upper bound on the time in minutes that the benchmark is expected to ' 'run. This time is annotated or tagged on the resources of cloud ' 'providers. Note that for retries, this applies to each individual retry.', ) flags.DEFINE_integer( 'persistent_timeout_minutes', 240, 'An upper bound on the time in minutes that resources left behind by the ' 'benchmark. Some benchmarks purposefully create resources for other ' 'benchmarks to use. Persistent timeout specifies how long these shared ' 'resources should live.', ) flags.DEFINE_bool( 'disable_interrupt_moderation', False, 'Turn off the interrupt moderation networking feature', ) flags.DEFINE_bool( 'disable_rss', False, 'Whether or not to disable the Receive Side Scaling feature.', ) flags.DEFINE_boolean( 'record_lscpu', True, 'Whether to record the lscpu output in a sample' ) flags.DEFINE_boolean( 'record_ulimit', False, 'Whether to record the ulimit output in a sample' ) RECORD_PROCCPU = flags.DEFINE_boolean( 'record_proccpu', True, 'Whether to record the /proc/cpuinfo output in a sample', ) flags.DEFINE_boolean( 'record_cpu_vuln', True, 'Whether to record the CPU vulnerabilities on linux VMs', ) flags.DEFINE_boolean( 'record_gcc', True, 'Whether to record the gcc version in a sample' ) flags.DEFINE_boolean( 'record_glibc', True, 'Whether to record the glibc version in a sample' ) # Support for using a proxy in the cloud environment. flags.DEFINE_string( 'http_proxy', '', 'Specify a proxy for HTTP in the form [user:passwd@]proxy.server:port.', ) flags.DEFINE_string( 'https_proxy', '', 'Specify a proxy for HTTPS in the form [user:passwd@]proxy.server:port.', ) flags.DEFINE_string( 'ftp_proxy', '', 'Specify a proxy for FTP in the form [user:passwd@]proxy.server:port.', ) flags.DEFINE_string( 'no_proxy', '', 'Specify host(s) to exclude from proxy, e.g. ' '--no_proxy=localhost,.example.com,192.168.0.1', ) flags.DEFINE_bool( 'randomize_run_order', False, 'When running with more than one benchmarks, ' 'randomize order of the benchmarks.', ) ALWAYS_CALL_CLEANUP = flags.DEFINE_boolean( 'always_call_cleanup', False, 'Indicates that this benchmark run should always run the Cleanup phase.' ) SKIP_TEARDOWN_CONDITIONS = flags.DEFINE_list( 'skip_teardown_conditions', [], 'A list of conditions that warrant skipping teardown. This is useful for ' 'investigating resources with interesting performance characteristics.\n' 'Each item contains three tokens: ' '\tmetric: the metric to check\n' '\tdirection: the direction to check against ("<" or ">")\n' '\tthreshold: the threshold to check against (in seconds)\n' 'For example: "kernel_start>50"\n' 'Additional conditions should be separated by commas. ' 'Adjust the --timeout_minutes flag to annotate the affected resources with ' 'your desired keep up time. The PKB run will complete, so users of this ' 'flag must have a spearate teardown procedure in place for resources with ' 'extended uptimes.', ) SKIP_TEARDOWN_ON_COMMAND_TIMEOUT = flags.DEFINE_boolean( 'skip_teardown_on_command_timeout', False, 'If true, skip teardown if the failure substatus is COMMAND_TIMEOUT.', ) SKIP_TEARDOWN_ZONAL_VM_LIMIT = flags.DEFINE_integer( 'skip_teardown_zonal_vm_limit', None, 'The maximum number of VMs in the zone (within a project) that can be left ' 'behind via the --skip_teardown_conditions flag. If skipping teardown will ' 'cause the number of VMs in the project to exceed this limit, teardown ' 'will be performed regardless of the --skip_teardown_conditions flag.', ) SKIP_TEARDOWN_KEEP_UP_MINUTES = flags.DEFINE_integer( 'skip_teardown_keep_up_minutes', 1440, # 24 hours 'The time in minutes that VMs left behind by the benchmark should live. ' 'This is used to annotate the "timeout_utc" tag for resources that are ' 'kept alive through the --skip_teardown_conditions flag.\n' 'Only implemented for GCE VMs.', ) CAPTURE_VM_LOGS = flags.DEFINE_bool( 'capture_vm_logs', False, 'Enables capture of VM logs. Currently limited to Linux syslogs, ' 'journalctl, and sos report.', )