w&b&>ddlmZddlZddlZddlZddlZddlZddlZddlZddl Z e e ds ddl m Z e e _ n#e e f$re j e _ YnwxYwejdZ ddlmZeZdZn #e$rdZYnwxYweres@ed ed es ed es ed ejd ddlmZmZddlmZmZmZmZddl m!Z!m"Z"Gdde#Z$Gdde$Z%d Z&d Z'dZ(d Z)dZ*Gdde#Z+dZ,dZ-dZ.Gdde$Z/Gdde$Z0Gd d!e$Z1d"Z2dS)#)print_functionN monotonic)rz /proc/self/io)VmStatTFz= 2.6.20 withz~ - I/O accounting support (CONFIG_TASKSTATS, CONFIG_TASK_DELAY_ACCT, CONFIG_TASK_IO_ACCOUNTING, kernel.task_delayacct sysctl)z0 - VM event counters (CONFIG_VM_EVENT_COUNTERS))iopriovmstat) ConnectionNETLINK_GENERICU32Attr NLM_F_REQUEST) Controller GeNlMessageceZdZdZdZdS)DumpableObjectzBBase class for objects that allows easy introspection when printedctt|dddtj|jdS)Nz: >)strtypepprintpformat__dict__selfs ,/usr/lib/python3/dist-packages/iotop/data.py__repr__zDumpableObject.__repr__Ks?T OOCRC000"N4=9999; ;N)__name__ __module__ __qualname____doc__rrrrrIs)LL;;;;;rrcJeZdZgdZdZdZd dZdZdZe dZ d S) Stats))blkio_delay_total()swapin_delay_total8) read_bytes) write_bytes)cancelled_write_bytesiFc|j}tjD]0\}}|||dz}tjd|d||<1tjs|jdkt_dSdS)NQr)rr$members_offsetsstructunpackhas_blkio_delay_totalr%)rtask_stats_buffersdnameoffsetdatas r__init__zStats.__init___s~ ]!1 3 3LD&$VFQJ%67D}S$//2BtHH* F*.*@A*EE ' ' ' F Frrc|j}|j}|j}tjD]\}}|||||zz||<dS)z3Update destination from operator(self, other_stats)Nrr$r1) r other_stats destinationcoeffddr6odmemberr8s r accumulatezStats.accumulatejsV  ! ]  !#3 9 9NFFFebj&88BvJJ 9 9rc2|||dS)z*Update destination with self - other_statsr)r?)rC)rr=r>s rdeltaz Stats.deltars{KrBBBrcV|j}tjD]\}}||dkrdSdS)NrFTr<)rr6r7r8s r is_all_zerozStats.is_all_zerovs= ]!1  LD&$x1}}uutrctt}|j}tjD] \}}d||< |S)Nr)r$__new__rr1)statsstdr7r8s rbuild_all_zerozStats.build_all_zero}s@ e$$n!1  LD&CII rN)r) rrr r1r4r:rCrErG staticmethodrLr"rrr$r$TsO" F F F9999CCC\rr$c eZdZdZdZdZdS)TaskStatsNetlinkc||_tt|_t |j}|d|_dS)N TASKSTATS)optionsr r connectionr get_family_id family_id)rrT controllers rr:zTaskStatsNetlink.__init__s@ $_5500 #11+>>rcnt|jttt|gt S)N)cmdattrsflags)rrWTASKSTATS_CMD_GETr TASKSTATS_CMD_ATTR_PIDr )rtids r build_requestzTaskStatsNetlink.build_requests44>/@")*@#"F"F!G!.000 0rc|j|j tj|j}n.#t $r!}|jt jkrYd}~dSd}~wwxYw|j D]&\}}|tkr| }n'dS|tj }t|dkrdStjd|ddd}|dksJt#|S)NiHrrN)task_stats_requestsendrUrrecvOSErrorerrnoESRCHr[itemsTASKSTATS_TYPE_AGGR_PIDnestedTASKSTATS_TYPE_STATSr9lenr2r3r$)rthreadreplye attr_type attr_valuetaskstats_datataskstats_versions rget_single_task_statsz&TaskStatsNetlink.get_single_task_statss)!&&t777 $T_55EE   w%+%%    &+[%6%6%8%8   !Iz333"))++4 F349 ~   $ $ F"M#~bqb/ABB1E A%%%%^$$$s; A&A! A!!A&N)rrr r:r`rvr"rrrQrQsA??? 000 %%%%%rrQcpg|_d}|jpgD]} t|}n[#t$rN t j|}|j}n.#t$r!td|tj d}YnwxYwYnwxYw|s|j ||rtj ddSdS)zDBuild options.uids from options.users by resolving usernames to UIDsFz Unknown user:)fileTrN) uidsusersint ValueErrorpwdgetpwnampw_uidKeyErrorprintsysstderrappendexit)rTerroruuidpasswds r find_uidsrsGL E ] b % % $a&&CC $ $ $ $a m    oqsz::::  $ % L   $ $ $   s2& A>A A> (A85A>7A88A>=A>ci} td|zdD]D} |dd\}}n#t$rY)wxYw|||<En#t$rYnwxYw|S)Nz/proc/%d/statusreplace)errors:r)opensplitr|stripIOError)pid result_dictlinekeyvalues rparse_proc_pid_statusrsK  *S0CCC - -D !ZZQ// UU      %{{}}K   -      s0A5A AAAA A+*A+c |dS#t$r|dcYSt$r|cYSwxYw)Nzutf-8 string_escape)decodeUnicodeDecodeErrorencodeAttributeError)ss rsafe_utf8_decodersgxx   )))xx((((( sA AAc*eZdZdZdZdZdZdZdS) ThreadInfozStats for a single threadc||_d|_d|_tt|_|||_dS)NT)r_mark stats_totalr$rI stats_deltar`rd)rr_taskstats_connections rr:zThreadInfo.__init__sH  ==//"6"D"DS"I"Irc4tj|jSN)rgetr_rs r get_iopriozThreadInfo.get_iopriosz$(###rcNtjtj|j||Sr)r set_ioprioIOPRIO_WHO_PROCESSr_)r ioprio_class ioprio_datas rrzThreadInfo.set_ioprios% !:DH!-{<< >5trc|jr|jS tjd|jztj}n#t $rd}YnwxYw||jkrd|_||_|S)Nz/proc/%d)rosstatrST_UIDrgrrrs rrzProcessInfo.get_uids{ 8 8O '*tx/00=CC   CCC  $(??DIDH s,= A  A c|}|_|jsX ttj|j|_n+#t tf$rt||_YnwxYw|jpdS)Nz{none}) rrrr}getpwuidpw_namerrrrs rget_userzProcessInfo.get_user*s{llnn ?49? %,S\#->->-FGG n- % % %HH  %y$H$s+A %A32A3c td|jz}|d}n#t$rYdSwxYwt |j}|s"|dd}|rd|z}nd}|Sd}t |d|j}||jkrGt |dd}|dd}||kr|d |zz }|d } | d d r1| d  d d z} | d | d| d <d |  }t||zS)Nz/proc/%d/cmdlineiz{no such process}Namez[%s]z {no name}Tgidz [%s]r/r ) rrreadrrrr{r startswithrfindjoinrr) r proc_cmdlinecmdline proc_statusproc_status_namesuffixtgid tgid_name thread_namepartsfirst_command_chars r get_cmdlinezProcessInfo.get_cmdline3s ' 2TX =>>L"''--GG ' ' '&&& '+DH55  $*vr::  /#),<#<  #. # #;??6484455 48  -d3377CCI%//&"55Ki'''K// d## 8  s # # 5!&q!4!4q!8 Qx 2 3 34E!H((5//''))& 0111s ,/ ==c|r|j S|jD]}|jsdSdS)NTF)rrGrvaluesr)r accumulatedts r did_some_iozProcessInfo.did_some_ioRsf  6'33555 5$$&&  A=,,.. tt urctd|jD}t|dkr|SdS)Nc3>K|]}|VdSr)r).0rs r z)ProcessInfo.get_ioprio..[s*GGAGGGGGGrrz?dif)setrrrnpop)r prioritiess rrzProcessInfo.get_ioprioZsRGG1D1D1F1FGGGGG z??a  >>## #vrcj|jD]}|||dSr)rrr)rrrros rrzProcessInfo.set_ioprio`sBl))++ 9 9F   lK 8 8 8 8 9 9rcNtj|Sr)rsort_keyrrs rioprio_sort_keyzProcessInfo.ioprio_sort_keydst00111rct|j|d}|st||}||j|<|Sr)rrr)rr_rros r get_threadzProcessInfo.get_threadgsB!!#t,, '%9::F &DL  rct}|jD]'\}}|js||j|(td|jD|_t|j}|sdS|xj |zc_ |xj |zc_ ||_|j |j|j dS)Nc*g|]\}}|j ||fSr")r)rr_ros r z,ProcessInfo.update_stats..ss=FFF{sF9?Fc6]FFFrFT) r$rLrrjrrCrdictrnr%r'r)rrr_ro nr_threadss rrzProcessInfo.update_statsns**,, <--// H HKC; H&&v'9;GGGFF!\//11FFFGG &&  5%%3%%&&*4&&& ##D$4d6FGGGtrN)rrr r!r:rrrrrrrrrrr"rrrrs666   "%%%222> 999222rrc8eZdZdZdZdZdZdZdZdZ dS) ProcessListci|_||_||_tj|_t j|_|dSr) rrrTrr timestamprrupdate_process_counts)rrrTs rr:zProcessList.__init__sN$8! ))moo  ""$$$$$rc|j|d}|st|}||j|<||jr|SdS)zyEither get the specified PID from self.processes or build a new ProcessInfo if we see this PID for the first timeN)rrrrrT)rrprocesss r get_processzProcessList.get_processsc.$$S$// *!#&&G")DN3     - - N  rc l|jjr |jjStjd}|jjr d|DSg}|D]j}d|dcxkrdkrUn |t ttjd|zdzZ#t$rYfwxYwk|S)Nz/proccXg|]'}d|dcxkrdknnt|(S)0r9)r{)rrs rrz*ProcessList.list_tgids..sCIII$3$q'3H3H3H3HS3H3H3H3H3HCII3H3H3Hrrrrz/proc/z/task) rTrrlistdirrextendmapr{rg)rtgidstidsrs r list_tgidszProcessList.list_tgidss <  %<$ $ 7## < ! JII%III I  Dd1g$$$$$$$$$KKC$&Jx$/H$I$I!K!KLLLLD % s"AB## B0/B0c ^|jjs|gS tttt jd|z}n#t$rgcYSwxYw|jjrFtt|jj t|}|S)Nz /proc/%d/task) rTrlistrr{rrrgrr intersection)rrrs r list_tidszProcessList.list_tidss|% 6M COd,B!C!CDDEEDD   III  <  HDL-..;;CIIFFGGD s7A AActj}||jz |_||_dx}}|D]}||}|s||D]p}|||j}|j |}|r7| ||j } || j z }|| j z }d|_q||f|jfS)NrF)rrrdurationrrr rrrvrrr)r+rrrE) r new_timestamp total_read total_writerrr_rorJrEs rrz!ProcessList.update_process_countss(( %6 &#$$ [OO%% ( (D&&t,,G ~~d++ ( ( ++C1JKK1GGOO(''...".E%"22J5#44K"'FK (K($+*;*;*=*===rc|jD]%}|jD] }d|_ &|}t d|jD|_|S)NTcDg|]\}}|||fSr")r)rrrs rrz1ProcessList.refresh_processes..s@777,#w&33557W~777r)rrrrrrrj)rrrototal_read_and_writes rrefresh_processeszProcessList.refresh_processess~,,.. # #G!/0022 # #"  # $99;;77#~335577788$#rci|_dSr)rrs rclearzProcessList.clears rN) rrr r:rrr rrrr"rrrrs} % % %   &   >>>, $ $ $rrc td5}tt|cdddS#1swxYwYdS#t $rYdSwxYw)Nz/proc/sys/kernel/task_delayacct)rboolr{rrFileNotFoundError)fs rsysctl_task_delayacctrs 3 4 4 /AFFHHNN,,--.. / / / / / / / / / / / / / / / / / / tts5A+AA A+A""A+%A"&A++ A98A9)3 __future__rrhrrr}rr2rrhasattrr ImportError RuntimeErrorpathexists ioaccounting iotop.vmstatrvmstat_fvm_event_countersrrriotoprr iotop.netlinkr r r r iotop.genetlinkr robjectrr$r]r^rkTASKSTATS_TYPE_PIDrmrQrrrrrrrr"rrr+s{(&%%%%%  74 % %#''''''"\"YDNNNw~~o.. ######vxxH  ,  E HIII E "### F E F F F B @AAA CHQKKK MMMMMMMMMMMM33333333;;;;;V;;;/////N///j#%#%#%#%#%v#%#%#%T*"!!!!!!!!.@@@@@.@@@F\\\\\.\\\~s#AAA6B BB