<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"
        integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD" crossorigin="anonymous">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css"
        integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ=="
        crossorigin="anonymous" referrerpolicy="no-referrer" />
</head>
</html>
3
`gB                 @   sj   d dl Z ddlmZ ddlT d dlZd dljZd dlm	Z	 d dl
Z
d dlZejj ZG dd dejZdS )    N   )hotplug)*)commandsc                   s  e Zd ZdZ fddZ fddZdd Zdd	 Zed
d Z	dd Z
dd Z fddZ fddZ fddZedd Zedd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Z fd,d-Zd.d/ ZdZd1d2Zd3d4 Zed5d6d7d8d9 Ze d5d[d;d<Z!ed=d6d7d>d? Z"e d=d\d@dAZ#edBd6d7dCdD Z$e dBd]dEdFZ%dGdH Z&dIdJ Z'edKd6d7dLdM Z(e dKd^dNdOZ)e*dPd6d7dQdR Z+dSdT Z,edUd6d7dVdW Z-e dUd_dXdYZ.  Z/S )`
DiskPlugina	  
	`disk`::
	
	Plug-in for tuning various block device options. This plug-in can also
	dynamically change the advanced power management and spindown timeout
	setting for a drive according to the current drive utilization. The
	dynamic tuning is controlled by the [option]`dynamic` and the global
	[option]`dynamic_tuning` option in `tuned-main.conf`.
	+
	The disk plug-in operates on all supported block devices unless a
	comma separated list of [option]`devices` is passed to it.
	+
	.Operate only on the sda block device
	====
	----
	[disk]
	# Comma separated list of devices, all devices if commented out.
	devices=sda
	----
	====
	+
	The [option]`elevator` option sets the Linux I/O scheduler.
	+
	.Use the bfq I/O scheduler on xvda block device
	====
	----
	[disk]
	device=xvda
	elevator=bfq
	----
	====
	+
	The [option]`scheduler_quantum` option only applies to the CFQ I/O
	scheduler. It defines the number of I/O requests that CFQ sends to
	one device at one time, essentially limiting queue depth. The default
	value is 8 requests. The device being used may support greater queue
	depth, but increasing the value of quantum will also increase latency,
	especially for large sequential write work loads.
	+
	The [option]`apm` option sets the Advanced Power Management feature
	on drives that support it. It corresponds to using the `-B` option of
	the `hdparm` utility. The [option]`spindown` option puts the drive
	into idle (low-power) mode, and also sets the standby (spindown)
	timeout for the drive. It corresponds to using `-S` option of the
	`hdparm` utility.
	+
	.Use a medium-agressive power management with spindown
	====
	----
	[disk]
	apm=128
	spindown=6
	----
	====
	+
	The [option]`readahead` option controls how much extra data the
	operating system reads from disk when performing sequential
	I/O operations. Increasing the `readahead` value might improve
	performance in application environments where sequential reading of
	large files takes place. The default unit for readahead is KiB. This
	can be adjusted to sectors by specifying the suffix 's'. If the
	suffix is specified, there must be at least one space between the
	number and suffix (for example, `readahead=8192 s`).
	+
	.Set the `readahead` to 4MB unless already set to a higher value
	====
	----
	[disk]
	readahead=>4096
	----
	====
	The disk readahead value can be multiplied by the constant
	specified by the [option]`readahead_multiply` option.
	c                sr   t t| j|| ddddddddd	d
ddg| _ddddddddddd	dg| _t| j| _d| _d| _t	 | _
d S )N               }   i   U   F   7         r                        n   Z   <      g{Gz?)superr   __init___power_levels_spindown_levelslen_levels_level_steps_load_smallestr   _cmd)selfargskwargs)	__class__ !/usr/lib/python3.6/plugin_disk.pyr   X   s    zDiskPlugin.__init__c                sd   t t| j  d| _d| _t | _t | _x,| j	j
dD ]}| j|r8| jj|j q8W t | _d S )NTblock)r   r   _init_devicesZ_devices_supported_use_hdparmsetZ_free_devicesdict_hdparm_apm_device_support_hardware_inventoryZget_devices_device_is_supportedaddZsys_nameZ_assigned_devices)r'   device)r*   r+   r,   r.   b   s    
zDiskPlugin._init_devicesc                s    fdd|D S )Nc                s   g | ]} j jd |qS )r-   )r3   Z
get_device).0x)r'   r+   r,   
<listcomp>n   s    z2DiskPlugin._get_device_objects.<locals>.<listcomp>r+   )r'   Zdevicesr+   )r'   r,   _get_device_objectsm   s    zDiskPlugin._get_device_objectsc             C   s   | j s
dS || jkr| j| S | jjddd| gtjgdd\}}}|tj krdtjd d| _ dS |rtjd|  tj	d	||f  d| j|< dS d
|krtjd|  d| j|< dS d| j|< dS )NFhdparmz-Cz/dev/%sT)	no_errorsZ
return_errz4hdparm command not found, ignoring for other devicesz#Device '%s' not supported by hdparmz(rc: %s, msg: '%s')unknownz3Driver for device '%s' does not support apm command)
r/   r2   r&   executeerrnoENOENTlogwarninfodebug)r'   r6   rcoutZerr_msgr+   r+   r,   _is_hdparm_apm_supportedp   s*    





z#DiskPlugin._is_hdparm_apm_supportedc             C   s2   |j dko0|jjdd dko0|jd kp0|jjdkS )	NdiskZ	removable   0scsivirtioxennvme)rJ   rK   rL   rM   )Zdevice_typeZ
attributesgetparentZ	subsystem)clsr6   r+   r+   r,   r4      s    

zDiskPlugin._device_is_supportedc             C   s   | j j| d| j d S )Nr-   )r3   Z	subscribe_hardware_events_callback)r'   r+   r+   r,   _hardware_events_init   s    z DiskPlugin._hardware_events_initc             C   s   | j j|  d S )N)r3   Zunsubscribe)r'   r+   r+   r,   _hardware_events_cleanup   s    z#DiskPlugin._hardware_events_cleanupc                s(   | j |s|dkr$tt| j|| d S )Nremove)r4   r   r   rQ   )r'   Zeventr6   )r*   r+   r,   rQ      s    z$DiskPlugin._hardware_events_callbackc                s,   |j d k	r|j j| tt| j|| d S )N)_load_monitorZ
add_devicer   r   _added_device_apply_tuning)r'   instancedevice_name)r*   r+   r,   rV      s    
z%DiskPlugin._added_device_apply_tuningc                s,   |j d k	r|j j| tt| j|| d S )N)rU   Zremove_devicer   r   _removed_device_unapply_tuning)r'   rW   rX   )r*   r+   r,   rY      s    
z)DiskPlugin._removed_device_unapply_tuningc             C   s   dd d d d d d dS )NT)dynamicelevatorapmspindown	readaheadreadahead_multiplyscheduler_quantumr+   )rP   r+   r+   r,   _get_config_options   s    zDiskPlugin._get_config_optionsc             C   s   ddgS )Nr\   r]   r+   )rP   r+   r+   r,   #_get_config_options_used_by_dynamic   s    z.DiskPlugin._get_config_options_used_by_dynamicc             C   sd   d|_ d| _d| _| j|jd rTd|_| jjd|j|_	i |_
i |_i |_i |_nd|_d |_	d S )NTr   rZ   rH   F)Z_has_static_tuning_apm_errcnt_spindown_errcntZ_option_boolZoptionsZ_has_dynamic_tuning_monitors_repositoryZcreateZassigned_devicesrU   Z_device_idle_stats_idle_spindown_change_delayed)r'   rW   r+   r+   r,   _instance_init   s    zDiskPlugin._instance_initc             C   s"   |j d k	r| jj|j  d |_ d S )N)rU   re   delete)r'   rW   r+   r+   r,   _instance_cleanup   s    
zDiskPlugin._instance_cleanupc             C   s   |rd}| j }n
d}| j}|tjkr(d S |dkr6d}nL|tj krbtjd  | _ | _tjd d S |d7 }|tjkrtjd|  |r|| _ n|| _d S )Nr]   r\   r   r   zIhdparm command not found, ignoring future set_apm / set_spindown commandsz5disabling set_%s command: too many consecutive errors)	rd   rc   constsERROR_THRESHOLDr?   r@   rA   rB   rC   )r'   rE   r]   sZcntr+   r+   r,   _update_errcnt   s&    


zDiskPlugin._update_errcntc             C   sN   t jd|  | jjdd| d| gtjgd\}}| j|d d|j|< d S )Nzchanging spindown to %dr;   z-S%dz/dev/%s)r<   TF)rA   rD   r&   r>   r?   r@   ro   rh   )r'   rW   r6   new_spindown_levelrE   rF   r+   r+   r,   _change_spindown   s    &zDiskPlugin._change_spindownc             C   s2   | j jddd| gtjgd\}}d|ko0d|kS )Nr;   z-Cz/dev/%s)r<   ZstandbyZsleeping)r&   r>   r?   r@   )r'   r6   rE   rF   r+   r+   r,   _drive_spinning   s    "zDiskPlugin._drive_spinningc             C   s(  | j |sd S |jj|}|d kr&d S ||jkr<| j|| | j||| | j|| |j| }|j| }|d d | jk r|d | j	kr|d | j	krd}n.|d dkr|d dks|d dkrd}nd}|dkr|d  |7  < | j
|d  }| j|d  }tjd|d   | jtjk rb| j| rT|dkrTtjd|  d|j|< n| j||| | jtjk rtjd	|  | jjd
d| d| gtjgd\}	}
| j|	d n4|j| r| j|r| j|d  }| j||| tjd||d |d f  tjd||d |d |d f  d S )Nlevelr   readwriter   ztuning level changed to %dz;delaying spindown change to %d, drive has already spun downTzchanging APM_level to %dr;   z-B%dz/dev/%s)r<   Fz %s load: read %0.2f, write %0.2fz$%s idle: read %d, write %d, level %d)rG   rU   Zget_device_loadrf   _init_stats_and_idle_update_stats_update_idlerg   r#   r$   r    r!   rA   rD   rd   rl   rm   rr   rh   rq   rc   r&   r>   r?   r@   ro   )r'   rW   r6   loadZstatsZidleZlevel_changeZnew_power_levelrp   rE   rF   r+   r+   r,   _instance_update_dynamic   sF    



.$
&z#DiskPlugin._instance_update_dynamicc             C   sD   ddg ddg ddg d|j |< dddd|j|< d|j|< d S )N   r   r   )newoldmax)rs   rt   ru   F)rf   rg   rh   )r'   rW   r6   r+   r+   r,   rw   !  s    $zDiskPlugin._init_stats_and_idlec             C   s   |j | d  |j | d< }||j | d< dd t||D }||j | d< |j | d }dd t||D }||j | d< t|d t|d  |j | d	< t|d
 t|d
  |j | d< d S )Nr}   r~   c             S   s   g | ]}|d  |d  qS )r   r   r+   )r7   Znew_oldr+   r+   r,   r9   +  s    z,DiskPlugin._update_stats.<locals>.<listcomp>diffr   c             S   s   g | ]}t |qS r+   )r   )r7   Zpairr+   r+   r,   r9   0  s    r   rt      ru   )rf   zipfloat)r'   rW   r6   Znew_loadZold_loadr   Zold_max_loadZmax_loadr+   r+   r,   rx   &  s    "zDiskPlugin._update_statsc             C   sL   xFdD ]>}|j | | | jk r6|j| |  d7  < qd|j| |< qW d S )Nrt   ru   r   r   )rt   ru   )rf   r%   rg   )r'   rW   r6   Z	operationr+   r+   r,   ry   7  s    
zDiskPlugin._update_idlec                s0   | j |stjd|  ntt| j|| d S )Nz<There is no dynamic tuning available for device '%s' at time)rG   rA   rC   r   r   _instance_apply_dynamic)r'   rW   r6   )r*   r+   r,   r   ?  s    
z"DiskPlugin._instance_apply_dynamicc             C   s   d S )Nr+   )r'   rW   r6   r+   r+   r,   _instance_unapply_dynamicH  s    z$DiskPlugin._instance_unapply_dynamic/sys/block/c             C   s@   d|kr0t jj||jdd|}t jj|r0|S t jj|||S )N/!)ospathjoinreplaceexists)r'   r6   suffixprefixZdevr+   r+   r,   _sysfs_pathK  s
    zDiskPlugin._sysfs_pathc             C   s   | j |dS )Nzqueue/scheduler)r   )r'   r6   r+   r+   r,   _elevator_fileR  s    zDiskPlugin._elevator_filer[   T)Z
per_devicec             C   s0   | j |}|s,| jj|||r$tjgndd |S )NF)no_error)r   r&   write_to_filer?   r@   )r'   valuer6   simrT   sys_filer+   r+   r,   _set_elevatorU  s
    

zDiskPlugin._set_elevatorFc             C   s"   | j |}| jj| jj||dS )N)r   )r   r&   Zget_active_option	read_file)r'   r6   ignore_missingr   r+   r+   r,   _get_elevator]  s    
zDiskPlugin._get_elevatorr\   c             C   s|   | j |s(|s tjd|  d S t|S | jtjk rt|sl| jjddt|d| gt	j
gd\}}| j|d t|S d S d S )Nz+apm option is not supported for device '%s'r;   z-Bz/dev/)r<   F)rG   rA   rC   strrc   rl   rm   r&   r>   r?   r@   ro   )r'   r   r6   r   rT   rE   rF   r+   r+   r,   _set_apmd  s    
(zDiskPlugin._set_apmc             C   s   | j |s |stjd|  d S d }d}| jjddd| gtjgd\}}|tj krZd S |dkrhd}n@tjd	|tj	}|ryt
|jd
}W n tk
r   d}Y nX |rtjd|  |S )Nz+apm option is not supported for device '%s'Fr;   z-Bz/dev/)r<   r   Tz.*=\s*(\d+).*r   z2could not get current APM settings for device '%s')rG   rA   rC   r&   r>   r?   r@   rematchSintgroup
ValueErrorerror)r'   r6   r   r   errrE   rF   mr+   r+   r,   _get_apmt  s(    
"
zDiskPlugin._get_apmr]   c             C   s|   | j |s(|s tjd|  d S t|S | jtjk rt|sl| jjddt|d| gt	j
gd\}}| j|d t|S d S d S )Nz0spindown option is not supported for device '%s'r;   z-Sz/dev/)r<   T)rG   rA   rC   r   rd   rl   rm   r&   r>   r?   r@   ro   )r'   r   r6   r   rT   rE   rF   r+   r+   r,   _set_spindown  s    
(zDiskPlugin._set_spindownc             C   s$   | j |s |stjd|  d S dS )Nz0spindown option is not supported for device '%s'   )rG   rA   rC   )r'   r6   r   r+   r+   r,   _get_spindown  s
    
zDiskPlugin._get_spindownc             C   s   | j |dS )Nzqueue/read_ahead_kb)r   )r'   r6   r+   r+   r,   _readahead_file  s    zDiskPlugin._readahead_filec             C   s^   t |jd d}yt|d }W n tk
r4   d S X t|dkrZ|d d dkrZ|d }|S )Nr   r   rn      )r   splitr   r   r"   )r'   r   valvr+   r+   r,   	_parse_ra  s    zDiskPlugin._parse_rar^   c             C   sZ   | j |}| j|}|d kr0tjd||f  n&|sV| jj|d| |rNtjgndd |S )Nz,Invalid readahead value '%s' for device '%s'z%dF)r   )r   r   rA   r   r&   r   r?   r@   )r'   r   r6   r   rT   r   r   r+   r+   r,   _set_readahead  s    

zDiskPlugin._set_readaheadc             C   s6   | j |}| jj||dj }t|dkr.d S t|S )N)r   r   )r   r&   r   stripr"   r   )r'   r6   r   r   r   r+   r+   r,   _get_readahead  s
    
zDiskPlugin._get_readaheadr_   c       	      C   s   |rd S | j d|d}|r^| j|}|d kr0d S tt|| }| jj|| | j||d n2| jj|}|d krvd S | j||d | jj| d S )Nr_   )Zcommand_namerX   F)	Z_storage_keyr   r   r   Z_storager0   r   rN   Zunset)	r'   ZenablingZ
multiplierr6   Zverifyr   Zstorage_keyZold_readaheadZnew_readaheadr+   r+   r,   _multiply_readahead  s"    
zDiskPlugin._multiply_readaheadc             C   s   | j |dS )Nzqueue/iosched/quantum)r   )r'   r6   r+   r+   r,   _scheduler_quantum_file  s    z"DiskPlugin._scheduler_quantum_filer`   c             C   s8   | j |}|s4| jj|dt| |r,tjgndd |S )Nz%dF)r   )r   r&   r   r   r?   r@   )r'   r   r6   r   rT   r   r+   r+   r,   _set_scheduler_quantum  s
    
z!DiskPlugin._set_scheduler_quantumc             C   sH   | j |}| jj||dj }t|dkr@|s<tjd|  d S t|S )N)r   r   z>disk_scheduler_quantum option is not supported for device '%s')r   r&   r   r   r"   rA   rC   r   )r'   r6   r   r   r   r+   r+   r,   _get_scheduler_quantum  s    
z!DiskPlugin._get_scheduler_quantum)r   )F)F)F)F)F)0__name__
__module____qualname____doc__r   r.   r:   rG   classmethodr4   rR   rS   rQ   rV   rY   ra   rb   ri   rk   ro   rq   rr   r{   rw   rx   ry   r   r   r   r   Zcommand_setr   Zcommand_getr   r   r   r   r   r   r   r   r   Zcommand_customr   r   r   r   __classcell__r+   r+   )r*   r,   r      sZ   J
2	
r   )r?    r   Z
decoratorsZ
tuned.logsZtunedZtuned.constsrl   Ztuned.utils.commandsr   r   r   ZlogsrN   rA   ZPluginr   r+   r+   r+   r,   <module>   s   

