in perfkitbenchmarker/linux_packages/memtier.py [0:0]
def RunGetLatencyAtCpu(cloud_instance, client_vms):
"""Run a modified binary search to find latency at a given CPU.
Args:
cloud_instance: A managed cloud instance. Only works on managed cloud
instances but could extend to vms.
client_vms: Need at least two client vms, one to hold the CPU utilization
load and the other to get the single threaded latency.
Returns:
A list of sample.Sample instances.
"""
samples = []
server_ip = cloud_instance.GetMemoryStoreIp()
server_port = cloud_instance.GetMemoryStorePort()
password = cloud_instance.GetMemoryStorePassword()
load_vm = client_vms[0]
latency_measurement_vm = client_vms[-1]
# Implement modified binary search to find optimal client count +/- tolerance
# of target CPU usage
target = MEMTIER_CPU_TARGET.value
# Larger clusters need two threads to get to maximum CPU
threads = 1 if cloud_instance.GetInstanceSize() < 150 or target < 0.5 else 2
pipeline = 1
# Set maximum of the binary search based off size of the instance
upper_bound = cloud_instance.GetInstanceSize() // 2 + 10
lower_bound = 1
current_clients = 1
while lower_bound < upper_bound:
current_clients = (upper_bound + lower_bound) // 2
_Run(
vm=load_vm,
server_ip=server_ip,
server_port=server_port,
threads=threads,
pipeline=pipeline,
clients=current_clients,
password=password,
)
cpu_percent = cloud_instance.MeasureCpuUtilization(
MEMTIER_CPU_DURATION.value
)
if not cpu_percent:
raise errors.Benchmarks.RunError(
'Could not measure CPU utilization for the instance.'
)
logging.info(
(
'Tried %s clients and got %s%% CPU utilization for the last run'
' with the target CPU being %s%%'
),
current_clients,
cpu_percent,
target,
)
if cpu_percent < target - CPU_TOLERANCE:
lower_bound = current_clients + 1
elif cpu_percent > target + CPU_TOLERANCE:
upper_bound = current_clients - 1
else:
logging.info(
'Finished binary search and the current client count is %s',
current_clients,
)
process_args = [
(
_Run,
[
load_vm,
server_ip,
server_port,
threads,
pipeline,
current_clients,
password,
],
{},
),
(
_GetSingleThreadedLatency,
[latency_measurement_vm, server_ip, server_port, password],
{},
),
]
results = background_tasks.RunParallelThreads(
process_args, len(process_args)
)
metadata = GetMetadata(
clients=current_clients, threads=threads, pipeline=pipeline
)
metadata['measured_cpu_percent'] = cloud_instance.MeasureCpuUtilization(
MEMTIER_CPU_DURATION.value
)
samples.extend(results[1].GetSamples(metadata))
return samples
# If complete binary search without finding a client count,
# it's not possible on this configuration.
raise errors.Benchmarks.RunError(
'Completed binary search and did not find a client count that worked for '
'this configuration and CPU utilization.'
)