first_cores=""
taskset_cores=""
first_cores_count=0
-nb_threads=4 #default from the benchmark
+nb_threads=1
drives=""
# Default options
done
}
-
detect_first_core() {
+ cpu_to_search="0"
+ if [ "${#drives[@]}" -eq 1 ]; then
+ device_name=$(block_dev_name ${drives[0]})
+ device_dir="/sys/block/${device_name}/device/"
+ pci_addr=$(cat ${device_dir}/address)
+ pci_dir="/sys/bus/pci/devices/${pci_addr}/"
+ cpu_to_search=$(cat ${pci_dir}/local_cpulist | cut -d"," -f 1 | cut -d"-" -f 1)
+ else
+ hint 'Passed multiple devices. Running on the first core.'
+ fi
+ core_to_run=$(lscpu --all -pSOCKET,CORE,CPU | grep ",$cpu_to_search\$" | cut -d"," -f1-2)
+
# Detect which logical cpus belongs to the first physical core
# If Hyperthreading is enabled, two cores are returned
- cpus=$(lscpu --all -pSOCKET,CORE,CPU |grep "0,0")
+ cpus=$(lscpu --all -pSOCKET,CORE,CPU | grep "$core_to_run")
for cpu in ${cpus}; do
IFS=','
# shellcheck disable=SC2206
sys_block_dir=$(get_sys_block_dir ${device_name})
target_file="${sys_block_dir}/$2"
value=$3
- [ -f "${target_file}" ] || fatal "Cannot find ${target_file} for ${device_name}"
- content=$(cat ${target_file})
+ [ -f "${target_file}" ] || return
+ content=$(cat ${target_file} 2>/dev/null)
if [ "${content}" != "${value}" ]; then
- info "${device_name}" "${target_file} set to ${value}."
- echo ${value} > ${target_file} 2>/dev/null || hint "${device_name}: Cannot set ${value} on ${target_file}"
+ echo ${value} > ${target_file} 2>/dev/null && info "${device_name}" "${target_file} set to ${value}." || hint "${device_name}: Cannot set ${value} on ${target_file}"
fi
}
}
show_nvme() {
+ device="$1"
device_name=$(block_dev_name $1)
device_dir="/sys/block/${device_name}/device/"
pci_addr=$(cat ${device_dir}/address)
pci_dir="/sys/bus/pci/devices/${pci_addr}/"
link_speed=$(cat ${pci_dir}/current_link_speed)
irq=$(cat ${pci_dir}/irq)
- numa=$(cat ${pci_dir}/numa_node)
+ numa=$([ -f ${pci_dir}/numa_node ] && cat ${pci_dir}/numa_node || echo "off")
cpus=$(cat ${pci_dir}/local_cpulist)
model=$(cat ${device_dir}/model | xargs) #xargs for trimming spaces
fw=$(cat ${device_dir}/firmware_rev | xargs) #xargs for trimming spaces
serial=$(cat ${device_dir}/serial | xargs) #xargs for trimming spaces
info ${device_name} "MODEL=${model} FW=${fw} serial=${serial} PCI=${pci_addr}@${link_speed} IRQ=${irq} NUMA=${numa} CPUS=${cpus} "
+ which nvme &> /dev/null
+ if [ $? -eq 0 ]; then
+ status=""
+ NCQA=$(nvme get-feature -H -f 0x7 ${device} 2>&1 |grep NCQA |cut -d ':' -f 2 | xargs)
+ [ -n "${NCQA}" ] && status="${status}Completion Queues:${NCQA}, "
+ NSQA=$(nvme get-feature -H -f 0x7 ${device} 2>&1 |grep NSQA |cut -d ':' -f 2 | xargs)
+ [ -n "${NSQA}" ] && status="${status}Submission Queues:${NSQA}, "
+ power_state=$(nvme get-feature -H -f 0x2 ${device} 2>&1 | grep PS |cut -d ":" -f 2 | xargs)
+ [ -n "${power_state}" ] && status="${status}PowerState:${power_state}, "
+ apste=$(nvme get-feature -H -f 0xc ${device} 2>&1 | grep APSTE |cut -d ":" -f 2 | xargs)
+ [ -n "${apste}" ] && status="${status} Autonomous Power State Transition:${apste}, "
+ temp=$(nvme smart-log ${device} 2>&1 |grep 'temperature' |cut -d ':' -f 2 |xargs)
+ [ -n "${temp}" ] && status="${status}Temp:${temp}"
+ info ${device_name} "${status}"
+ fi
}
show_device() {
is_nvme $1 && show_nvme $1
}
+show_kernel_config_item() {
+ config_item="CONFIG_$1"
+ config_file="/boot/config-$(uname -r)"
+ if [ ! -f "${config_file}" ]; then
+ config_file='/proc/config.gz'
+ if [ ! -f "${config_file}" ]; then
+ return
+ fi
+ fi
+ status=$(zgrep ${config_item}= ${config_file})
+ if [ -z "${status}" ]; then
+ echo "${config_item}=N"
+ else
+ echo "${config_item}=$(echo ${status} | cut -d '=' -f 2)"
+ fi
+}
+
show_system() {
CPU_MODEL=$(grep -m1 "model name" /proc/cpuinfo | awk '{print substr($0, index($0,$4))}')
MEMORY_SPEED=$(dmidecode -t 17 -q | grep -m 1 "Configured Memory Speed: [0-9]" | awk '{print substr($0, index($0,$4))}')
info "system" "CPU: ${CPU_MODEL}"
info "system" "MEMORY: ${MEMORY_SPEED}"
info "system" "KERNEL: ${KERNEL}"
+ for config_item in BLK_CGROUP BLK_WBT_MQ HZ RETPOLINE PAGE_TABLE_ISOLATION; do
+ info "system" "KERNEL: $(show_kernel_config_item ${config_item})"
+ done
+ info "system" "KERNEL: $(cat /proc/cmdline)"
+ info "system" "SElinux: $(getenforce)"
tsc=$(journalctl -k | grep 'tsc: Refined TSC clocksource calibration:' | awk '{print $11}')
if [ -n "${tsc}" ]; then
info "system" "TSC: ${tsc} Mhz"
check_sysblock_value ${drive} "queue/iostats" 0 # Ensure iostats are disabled
check_sysblock_value ${drive} "queue/nomerges" 2 # Ensure merge are disabled
check_sysblock_value ${drive} "queue/io_poll" 1 # Ensure io_poll is enabled
+ check_sysblock_value ${drive} "queue/wbt_lat_usec" 0 # Disabling wbt lat
show_device ${drive}
done