Quality of Service¶
Introduction¶
Quality of Service policies allow to flexibly define the performance level for a given entity (e.g. a pool or a dataset).
Performance upper limit can be set in IOPS or in bandwidth (Mbps, Gbps, etc). Also, a burst can be defined, to allow the limits be exceeded for short periods.
Creation¶
The QosPolicy
is an object, which has the same fields as the corresponding InfiniBox object.
Creating a policy is done by using the create
method:
>>> qos_policy = system.qos_policies.create(type='volume', max_ops=1000, name='my_policy')
The ‘type’ field must be one of: ‘volume’, ‘pool_volume’.
Manipulation¶
QosPolicy
fields can be accessed, modified, queried and deleted in the same manner as any other InfiniSDK object:
>>> qos_policy.get_max_ops()
1000
>>> qos_policy.update_max_bps(100000000)
>>> qos_policy.get_max_bps()
100000000
>>> from infinisdk import Q
>>> print(', '.join([policy.get_name() for policy in system.qos_policies.find(Q.max_bps >= 1000).to_list()]))
my_policy
>>> qos_policy.delete()
Entities Assignment¶
An assignment of a QosPolicy
object to a pool or a dataset can be done in two ways.
The first one is by referencing the QoS policy object:
>>> qos_policy = system.qos_policies.create(type='volume', max_ops=1000, name='my_policy')
>>> qos_policy.assign_entity(volume)
The second one is by referencing the entity object and calling assign_qos_policy
.
A pool can be assigned to a ‘pool_volume` QoS policy:
>>> pool_qos_policy = system.qos_policies.create(type='pool_volume', max_ops=10000, burst_enabled=False, name='vol_policy')
>>> pool.assign_qos_policy(pool_qos_policy)
>>> print(', '.join([policy.get_name() for policy in pool.get_qos_policies()]))
vol_policy
Querying¶
QoS Policy of a dataset can be retrieved by using the get_qos_policy
method:
>>> print(volume.get_qos_policy().get_name())
my_policy
A dataset can also have a shared QoS policy, from its pool:
>>> print(volume.get_qos_shared_policy().get_name())
vol_policy
As a pool can have 2 policies, the get_qos_policy
method is used.
Also, these convenience methods exist:
>>> print(pool.get_volume_qos_policy().get_name())
vol_policy
It is possible to get all entities assigned to a QoS policy, using get_assigned_entities
:
>>> print(', '.join([entity.get_name() for entity in qos_policy.get_assigned_entities()]))
my_volume
All entities assigned to QoS policies can be fetched as well:
>>> print(', '.join([entity.get_name() for entity in system.qos_policies.get_assigned_entities()]))
my_volume, my_pool
Unassignment¶
As with assignment, clearing QoS policies can also be done in two ways:
>>> volume.unassign_qos_policy(qos_policy)
>>> volume.assign_qos_policy(qos_policy)
>>> qos_policy.unassign_entity(volume)
For pools:
>>> pool.unassign_qos_policies()
Misc¶
Retrieving all existing QoS policies in the system:
>>> system.qos_policies.get_all()
<Query /api/rest/qos/policies>