mirror of
https://github.com/OpenNebula/one.git
synced 2025-04-01 06:50:25 +03:00
F #6303: Automatic setting of IO queues
This commit adds support for the "auto" keywork for the VIRTIO_SCSI_QUEUES attribute. The number of queues is set to the number of virtual CPUs in this case. Also a new DISK attribute, QUEUES has been added to the VM DISK definition to set the numner of virt queues for virt-blk. This parameter also supports the auto keyword to set it to the number of VCPUs. These parameters can be set by default in vmm_exec_kvm.conf.
This commit is contained in:
parent
7a77dff659
commit
da3ce70341
@ -400,6 +400,27 @@ static string get_disk_bus(const std::string &machine,
|
||||
return "ide";
|
||||
}
|
||||
|
||||
static void set_queues(string& queue, const string& vcpu)
|
||||
{
|
||||
one_util::tolower(queue);
|
||||
|
||||
if ( queue == "auto" )
|
||||
{
|
||||
queue = vcpu;
|
||||
}
|
||||
else if (!queue.empty())
|
||||
{
|
||||
char * end_ptr;
|
||||
|
||||
strtol(queue.c_str(), &end_ptr, 10);
|
||||
|
||||
if ( *end_ptr != '\0' )
|
||||
{
|
||||
queue.clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------------------------------------- */
|
||||
/* -------------------------------------------------------------------------- */
|
||||
|
||||
@ -495,122 +516,124 @@ int LibVirtDriver::deployment_description_kvm(
|
||||
int memory;
|
||||
int memory_max;
|
||||
|
||||
string emulator_path = "";
|
||||
string emulator_path;
|
||||
|
||||
string kernel = "";
|
||||
string initrd = "";
|
||||
string root = "";
|
||||
string kernel_cmd = "";
|
||||
string bootloader = "";
|
||||
string arch = "";
|
||||
string machine = "";
|
||||
string kernel;
|
||||
string initrd;
|
||||
string root;
|
||||
string kernel_cmd;
|
||||
string bootloader;
|
||||
string arch;
|
||||
string machine;
|
||||
|
||||
vector<string> boots;
|
||||
|
||||
string cpu_model = "";
|
||||
string cpu_feature = "";
|
||||
string cpu_mode = "";
|
||||
string cpu_model;
|
||||
string cpu_feature;
|
||||
string cpu_mode;
|
||||
|
||||
vector<const VectorAttribute *> disk;
|
||||
const VectorAttribute * context;
|
||||
|
||||
string type = "";
|
||||
string disk_type = "";
|
||||
string target = "";
|
||||
string bus = "";
|
||||
string ro = "";
|
||||
string driver = "";
|
||||
string cache = "";
|
||||
string disk_io = "";
|
||||
string discard = "";
|
||||
string source = "";
|
||||
string clone = "";
|
||||
string shareable = "";
|
||||
string ceph_host = "";
|
||||
string ceph_secret = "";
|
||||
string ceph_user = "";
|
||||
string iscsi_host = "";
|
||||
string iscsi_user = "";
|
||||
string iscsi_usage = "";
|
||||
string iscsi_iqn = "";
|
||||
string pool_name = "";
|
||||
string sheepdog_host = "";
|
||||
string gluster_host = "";
|
||||
string gluster_volume = "";
|
||||
string luks_secret = "";
|
||||
string type;
|
||||
string disk_type;
|
||||
string target;
|
||||
string bus;
|
||||
string ro;
|
||||
string driver;
|
||||
string cache;
|
||||
string disk_io;
|
||||
string discard;
|
||||
string source;
|
||||
string clone;
|
||||
string blk_queues;
|
||||
string shareable;
|
||||
string ceph_host;
|
||||
string ceph_secret;
|
||||
string ceph_user;
|
||||
string iscsi_host;
|
||||
string iscsi_user;
|
||||
string iscsi_usage;
|
||||
string iscsi_iqn;
|
||||
string pool_name;
|
||||
string sheepdog_host;
|
||||
string gluster_host;
|
||||
string gluster_volume;
|
||||
string luks_secret;
|
||||
|
||||
string total_bytes_sec = "";
|
||||
string total_bytes_sec_max_length = "";
|
||||
string total_bytes_sec_max = "";
|
||||
string read_bytes_sec = "";
|
||||
string read_bytes_sec_max_length = "";
|
||||
string read_bytes_sec_max = "";
|
||||
string write_bytes_sec = "";
|
||||
string write_bytes_sec_max_length = "";
|
||||
string write_bytes_sec_max = "";
|
||||
string total_iops_sec = "";
|
||||
string total_iops_sec_max_length = "";
|
||||
string total_iops_sec_max = "";
|
||||
string read_iops_sec = "";
|
||||
string read_iops_sec_max_length = "";
|
||||
string read_iops_sec_max = "";
|
||||
string write_iops_sec = "";
|
||||
string write_iops_sec_max_length = "";
|
||||
string write_iops_sec_max = "";
|
||||
string size_iops_sec;
|
||||
string iothreadid;
|
||||
string total_bytes_sec;
|
||||
string total_bytes_sec_max_length;
|
||||
string total_bytes_sec_max;
|
||||
string read_bytes_sec;
|
||||
string read_bytes_sec_max_length;
|
||||
string read_bytes_sec_max;
|
||||
string write_bytes_sec;
|
||||
string write_bytes_sec_max_length;
|
||||
string write_bytes_sec_max;
|
||||
string total_iops_sec;
|
||||
string total_iops_sec_max_length;
|
||||
string total_iops_sec_max;
|
||||
string read_iops_sec;
|
||||
string read_iops_sec_max_length;
|
||||
string read_iops_sec_max;
|
||||
string write_iops_sec;
|
||||
string write_iops_sec_max_length;
|
||||
string write_iops_sec_max;
|
||||
string size_iops_sec;
|
||||
string iothreadid;
|
||||
|
||||
string default_total_bytes_sec = "";
|
||||
string default_total_bytes_sec_max_length = "";
|
||||
string default_total_bytes_sec_max = "";
|
||||
string default_read_bytes_sec = "";
|
||||
string default_read_bytes_sec_max_length = "";
|
||||
string default_read_bytes_sec_max = "";
|
||||
string default_write_bytes_sec = "";
|
||||
string default_write_bytes_sec_max_length = "";
|
||||
string default_write_bytes_sec_max = "";
|
||||
string default_total_iops_sec = "";
|
||||
string default_total_iops_sec_max_length = "";
|
||||
string default_total_iops_sec_max = "";
|
||||
string default_read_iops_sec = "";
|
||||
string default_read_iops_sec_max_length = "";
|
||||
string default_read_iops_sec_max = "";
|
||||
string default_write_iops_sec = "";
|
||||
string default_write_iops_sec_max_length = "";
|
||||
string default_write_iops_sec_max = "";
|
||||
string default_size_iops_sec;
|
||||
string default_total_bytes_sec;
|
||||
string default_total_bytes_sec_max_length;
|
||||
string default_total_bytes_sec_max;
|
||||
string default_read_bytes_sec;
|
||||
string default_read_bytes_sec_max_length;
|
||||
string default_read_bytes_sec_max;
|
||||
string default_write_bytes_sec;
|
||||
string default_write_bytes_sec_max_length;
|
||||
string default_write_bytes_sec_max;
|
||||
string default_total_iops_sec;
|
||||
string default_total_iops_sec_max_length;
|
||||
string default_total_iops_sec_max;
|
||||
string default_read_iops_sec;
|
||||
string default_read_iops_sec_max_length;
|
||||
string default_read_iops_sec_max;
|
||||
string default_write_iops_sec;
|
||||
string default_write_iops_sec_max_length;
|
||||
string default_write_iops_sec_max;
|
||||
string default_size_iops_sec;
|
||||
|
||||
int disk_id;
|
||||
int order;
|
||||
string default_driver = "";
|
||||
string default_driver_cache = "";
|
||||
string default_driver_disk_io = "";
|
||||
string default_driver_discard = "";
|
||||
bool readonly;
|
||||
int disk_id;
|
||||
int order;
|
||||
string default_driver;
|
||||
string default_driver_cache;
|
||||
string default_driver_disk_io;
|
||||
string default_driver_discard;
|
||||
string default_blk_queues;
|
||||
bool readonly;
|
||||
|
||||
vector<const VectorAttribute *> nic;
|
||||
|
||||
string mac = "";
|
||||
string bridge = "";
|
||||
string vn_mad = "";
|
||||
string script = "";
|
||||
string model = "";
|
||||
string ip = "";
|
||||
string vrouter_ip = "";
|
||||
string filter = "";
|
||||
string virtio_queues = "";
|
||||
string bridge_type = "";
|
||||
string nic_id = "";
|
||||
string mac;
|
||||
string bridge;
|
||||
string vn_mad;
|
||||
string script;
|
||||
string model;
|
||||
string ip;
|
||||
string vrouter_ip;
|
||||
string filter;
|
||||
string virtio_queues;
|
||||
string bridge_type;
|
||||
string nic_id;
|
||||
|
||||
string i_avg_bw = "";
|
||||
string i_peak_bw = "";
|
||||
string i_peak_kb = "";
|
||||
string o_avg_bw = "";
|
||||
string o_peak_bw = "";
|
||||
string o_peak_kb = "";
|
||||
string i_avg_bw;
|
||||
string i_peak_bw;
|
||||
string i_peak_kb;
|
||||
string o_avg_bw;
|
||||
string o_peak_bw;
|
||||
string o_peak_kb;
|
||||
|
||||
string default_filter = "";
|
||||
string default_model = "";
|
||||
string default_filter;
|
||||
string default_model ;
|
||||
|
||||
const VectorAttribute * graphics;
|
||||
|
||||
@ -618,38 +641,39 @@ int LibVirtDriver::deployment_description_kvm(
|
||||
|
||||
vector<const VectorAttribute *> pci;
|
||||
|
||||
string domain = "";
|
||||
string domain;
|
||||
/* bus is already defined for disks */
|
||||
string slot = "";
|
||||
string func = "";
|
||||
string slot;
|
||||
string func;
|
||||
|
||||
string vm_domain = "";
|
||||
string vm_bus = "";
|
||||
string vm_slot = "";
|
||||
string vm_func = "";
|
||||
string vm_domain;
|
||||
string vm_bus;
|
||||
string vm_slot;
|
||||
string vm_func;
|
||||
|
||||
bool pae = false;
|
||||
bool acpi = false;
|
||||
bool apic = false;
|
||||
bool hyperv = false;
|
||||
bool localtime = false;
|
||||
bool guest_agent = false;
|
||||
int virtio_scsi_queues = 0;
|
||||
int scsi_targets_num = 0;
|
||||
int iothreads = 0;
|
||||
int iothread_actual = 1;
|
||||
bool pae = false;
|
||||
bool acpi = false;
|
||||
bool apic = false;
|
||||
bool hyperv = false;
|
||||
bool localtime = false;
|
||||
bool guest_agent = false;
|
||||
|
||||
string hyperv_options = "";
|
||||
int scsi_targets_num = 0;
|
||||
int iothreads = 0;
|
||||
int iothread_actual = 1;
|
||||
|
||||
string virtio_scsi_queues;
|
||||
string hyperv_options;
|
||||
|
||||
vector<const VectorAttribute *> raw;
|
||||
string default_raw = "";
|
||||
string data = "";
|
||||
string default_raw;
|
||||
string data;
|
||||
|
||||
const VectorAttribute * topology;
|
||||
vector<const VectorAttribute *> nodes;
|
||||
|
||||
std::string numa_tune = "";
|
||||
std::string mbacking = "";
|
||||
std::string numa_tune;
|
||||
std::string mbacking;
|
||||
|
||||
std::string sd_bus;
|
||||
std::string disk_bus;
|
||||
@ -1029,6 +1053,7 @@ int LibVirtDriver::deployment_description_kvm(
|
||||
|
||||
get_attribute(nullptr, host, cluster, "DISK", "IO", default_driver_disk_io);
|
||||
get_attribute(nullptr, host, cluster, "DISK", "DISCARD", default_driver_discard);
|
||||
get_attribute(nullptr, host, cluster, "DISK", "QUEUES", default_blk_queues);
|
||||
|
||||
get_attribute(nullptr, host, cluster, "DISK", "TOTAL_BYTES_SEC", default_total_bytes_sec);
|
||||
get_attribute(nullptr, host, cluster, "DISK", "TOTAL_BYTES_SEC_MAX", default_total_bytes_sec_max);
|
||||
@ -1072,6 +1097,7 @@ int LibVirtDriver::deployment_description_kvm(
|
||||
discard = disk[i]->vector_value("DISCARD");
|
||||
source = disk[i]->vector_value("SOURCE");
|
||||
clone = disk[i]->vector_value("CLONE");
|
||||
blk_queues= disk[i]->vector_value("QUEUES");
|
||||
shareable = disk[i]->vector_value("SHAREABLE");
|
||||
|
||||
ceph_host = disk[i]->vector_value("CEPH_HOST");
|
||||
@ -1458,6 +1484,22 @@ int LibVirtDriver::deployment_description_kvm(
|
||||
}
|
||||
}
|
||||
|
||||
if (!blk_queues.empty())
|
||||
{
|
||||
set_queues(blk_queues, vcpu);
|
||||
}
|
||||
else if (!default_blk_queues.empty())
|
||||
{
|
||||
set_queues(default_blk_queues, vcpu);
|
||||
|
||||
blk_queues = default_blk_queues;
|
||||
}
|
||||
|
||||
if (!blk_queues.empty())
|
||||
{
|
||||
file << " queues=" << one_util::escape_xml_attr(blk_queues);
|
||||
}
|
||||
|
||||
file << "/>" << endl;
|
||||
|
||||
// ---- I/O Options ----
|
||||
@ -2058,7 +2100,9 @@ int LibVirtDriver::deployment_description_kvm(
|
||||
<< "\t</devices>" << endl;
|
||||
}
|
||||
|
||||
if ( virtio_scsi_queues > 0 || scsi_targets_num > 1)
|
||||
set_queues(virtio_scsi_queues, vcpu);
|
||||
|
||||
if ( !virtio_scsi_queues.empty() || scsi_targets_num > 1)
|
||||
{
|
||||
file << "\t<devices>" << endl
|
||||
<< "\t\t<controller type='scsi' index='0' model='virtio-scsi'>"
|
||||
@ -2066,7 +2110,7 @@ int LibVirtDriver::deployment_description_kvm(
|
||||
|
||||
file << "\t\t\t<driver";
|
||||
|
||||
if ( virtio_scsi_queues > 0 )
|
||||
if ( !virtio_scsi_queues.empty() )
|
||||
{
|
||||
file << " queues=" << one_util::escape_xml_attr(virtio_scsi_queues);
|
||||
}
|
||||
|
@ -6,9 +6,12 @@
|
||||
# - vcpu
|
||||
# - memory_slots: number of memory slots for hotplug memory
|
||||
# - graphics [type, listen, passwd, keymap, random_passwd]
|
||||
# - features [acpi, pae, apic, hyperv, localtime, guest_agent, virtio_scsi_queues, iothreads]
|
||||
# - features [acpi, pae, apic, hyperv, localtime, guest_agent,
|
||||
# virtio_scsi_queues, iothreads, virtio_scsi_queues]
|
||||
# - cpu_model [model]
|
||||
# - disk [driver, cache, io, discard, total_bytes_sec, total_iops_sec, read_bytes_sec, write_bytes_sec, read_iops_sec, write_iops_sec, size_iops_sec]
|
||||
# - disk [driver, cache, io, queues, discard, total_bytes_sec, total_iops_sec,
|
||||
# read_bytes_sec, write_bytes_sec, read_iops_sec, write_iops_sec,
|
||||
# size_iops_sec]
|
||||
# - nic [filter, model]
|
||||
# - raw
|
||||
# - hyperv_options: options used for FEATURES = [ HYPERV = yes ]
|
||||
@ -30,7 +33,7 @@ FEATURES = [
|
||||
APIC = "no",
|
||||
HYPERV = "no",
|
||||
GUEST_AGENT = "yes",
|
||||
VIRTIO_SCSI_QUEUES = "1",
|
||||
VIRTIO_SCSI_QUEUES = "auto",
|
||||
IOTHREADS = "0"
|
||||
]
|
||||
|
||||
@ -39,7 +42,8 @@ FEATURES = [
|
||||
DISK = [
|
||||
DRIVER = "raw",
|
||||
CACHE = "none",
|
||||
DISCARD = "unmap"
|
||||
DISCARD = "unmap",
|
||||
QUEUES = "auto"
|
||||
]
|
||||
|
||||
NIC = [
|
||||
|
Loading…
x
Reference in New Issue
Block a user