o id+< @sddlmZddlZddlZddlZddlZddlZddlZddlZddl Z ze e ds5ddl m Z e e _ Wne e fyEe j e _ YnwejdZz ddlmZeZWn eybdZYnwdZeriesed ed eswed es}ed ed ddlmZmZddlmZmZmZmZddl m!Z!m"Z"Gddde#Z$Gddde$Z%d Z&d Z'dZ(d Z)dZ*Gddde#Z+ddZ,ddZ-ddZ.Gdd d e$Z/Gd!d"d"e$Z0Gd#d$d$e$Z1dS)%)print_functionN monotonic)rz /proc/self/io)VmStatFTz= 2.6.20 withz` - I/O accounting support (CONFIG_TASKSTATS, CONFIG_TASK_DELAY_ACCT, CONFIG_TASK_IO_ACCOUNTING)z0 - VM event counters (CONFIG_VM_EVENT_COUNTERS))iopriovmstat) ConnectionNETLINK_GENERICU32Attr NLM_F_REQUEST) Controller GeNlMessagec@seZdZdZddZdS)DumpableObjectzBBase class for objects that allows easy introspection when printedcCs$dtt|ddt|jfS)Nz%s: %s>)strtypepprintpformat__dict__selfr,/usr/lib/python3/dist-packages/iotop/data.py__repr__Ks zDumpableObject.__repr__N)__name__ __module__ __qualname____doc__rrrrrrIs rc@sFeZdZgdZdZddZdddZdd Zd d Ze d d Z dS)Stats))blkio_delay_total()swapin_delay_total8) read_bytes) write_bytes)cancelled_write_bytesiFcCsT|j}tjD]\}}|||d}td|d||<qtjs(|jdkt_dSdS)NQr)rrmembers_offsetsstructunpackhas_blkio_delay_totalr)rtask_stats_buffersdnameoffsetdatarrr__init___szStats.__init__rc Cs>|j}|j}|j}tjD]\}}|||||||<q dS)z3Update destination from operator(self, other_stats)Nrrr*) r other_stats destinationcoeffddr/odmemberr1rrr accumulatejs zStats.accumulatecCs|j||ddS)z*Update destination with self - other_statsr)r7)r;)rr5r6rrrdeltarsz Stats.deltacCs,|j}tjD] \}}||dkrdSqdS)NrFTr4)rr/r0r1rrr is_all_zerovs  zStats.is_all_zerocCs,tt}|j}tjD]\}}d||<q |S)Nr)r__new__rr*)statsstdr0r1rrrbuild_all_zero}s  zStats.build_all_zeroN)r) rrrr*r-r3r;r<r= staticmethodrArrrrrTs rc@s$eZdZddZddZddZdS)TaskStatsNetlinkcCs*||_tt|_t|j}|d|_dS)N TASKSTATS)optionsrr connectionr get_family_id family_id)rrG controllerrrrr3s  zTaskStatsNetlink.__init__cCst|jttt|gtdS)N)cmdattrsflags)r rJTASKSTATS_CMD_GETr TASKSTATS_CMD_ATTR_PIDr )rtidrrr build_requests zTaskStatsNetlink.build_requestc Cs|j|jzt|j}Wnty)}z|jtjkr$WYd}~dSd}~ww|j D]\}}|t kr=| }nq/dS|t j }t|dkrMdStd|ddd}|dks_Jt|S)NiHrrC)task_stats_requestsendrHr recvOSErrorerrnoESRCHrMitemsTASKSTATS_TYPE_AGGR_PIDnestedTASKSTATS_TYPE_STATSr2lenr+r,r)rthreadreplye attr_type attr_valuetaskstats_datataskstats_versionrrrget_single_task_statss*    z&TaskStatsNetlink.get_single_task_statsN)rrrr3rRrgrrrrrEs rEc Csg|_d}|jp gD]8}zt|}Wn'ty9zt|}Wnty3td|tj dd}Ynw|j }Ynw|sB|j |q |rLt ddSdS)zDBuild options.uids from options.users by resolving usernames to UIDsFz Unknown user:)fileTrN) uidsusersint ValueErrorpwdgetpwnamKeyErrorprintsysstderrpw_uidappendexit)rGerroruuidpasswdrrr find_uidss*    rzcCsRi}ztd|ddD]}|dd\}}|||<q W|Sty(Y|Sw)Nz/proc/%d/statusreplace)errors:r)opensplitstripIOError)pid result_dictlinekeyvaluerrrparse_proc_pid_statuss rcCs>z|dWSty|dYSty|YSw)Nzutf-8 string_escape)decodeUnicodeDecodeErrorencodeAttributeError)srrrsafe_utf8_decodes   rc@s0eZdZdZddZddZddZdd Zd S) ThreadInfozStats for a single threadcCs.||_d|_d|_tt|_|||_dS)NT)rQmark stats_totalrr> stats_deltarRrU)rrQtaskstats_connectionrrrr3s  zThreadInfo.__init__cCs t|jSN)rgetrQrrrr get_ioprios zThreadInfo.get_iopriocCsttj|j||Sr)r set_ioprioIOPRIO_WHO_PROCESSrQ)r ioprio_class ioprio_datarrrrs zThreadInfo.set_iopriocCs&|js||_||j|j||_dSr)rr<r)rr?rrr update_statss zThreadInfo.update_statsN)rrrrr3rrrrrrrrs  rc@sheZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZdS) ProcessInfozStats for a single process (a single line in the output): if options.processes is set, it is a collection of threads, otherwise a single thread.cCs:||_d|_d|_i|_t|_t|_t |_ dSr) rrxuserthreadsrrAr stats_accumtimerstats_accum_timestamp)rrrrrr3s  zProcessInfo.__init__cCs8|jr|js|j|jvrdS|jr||jvrdSdS)NFT)pids processesrriget_uid)rrGrrr is_monitoreds  zProcessInfo.is_monitoredcCsX|jr|jSz td|jtj}Wn tyd}Ynw||jkr*d|_||_|S)Nz/proc/%d)rxosstatrST_UIDrXrrrxrrrrs  zProcessInfo.get_uidc CsX|}|dur'|js'z tt|j|_Wnttfy&t||_Ynw|jp+dS)Nz{none}) rrrrmgetpwuidpw_namerorrrrrrget_user$s zProcessInfo.get_userc Cs ztd|j}|d}Wn tyYdSwt|j}|s2|dd}|r.d|}|Sd}|Sd}t|d|j}||jkrZt|dd}|dd}||krZ|d |7}|d } | d d ry| d  d d } | d | d| d <d |  }t ||S)Nz/proc/%d/cmdlineiz{no such process}Namez[%s]z {no name}Tgidz [%s]r/r ) r~rreadrrrrkr startswithrfindjoinrr) r proc_cmdlinecmdline proc_statusproc_status_namesuffixtgid tgid_name thread_namepartsfirst_command_charrrr get_cmdline-s6        zProcessInfo.get_cmdlinecCs4|r|j S|jD] }|jsdSq dS)NTF)rr=rvaluesr)r accumulatedtrrr did_some_ioLs  zProcessInfo.did_some_iocCs0tdd|jD}t|dkr|SdS)Ncss|]}|VqdSr)r).0rrrr Usz)ProcessInfo.get_ioprio..rz?dif)setrrr_pop)r prioritiesrrrrTs zProcessInfo.get_iopriocCs |jD]}|||qdSr)rrr)rrrr`rrrrZszProcessInfo.set_iopriocCst|Sr)rsort_keyrrrrrioprio_sort_key^szProcessInfo.ioprio_sort_keycCs*|j|d}|st||}||j|<|Sr)rrr)rrQrr`rrr get_threadas   zProcessInfo.get_threadcCst}|jD]\}}|js||j|q tdd|jD|_t|j}|s.dS|j |_ |j |_ ||_|j |j|j dS)NcSsg|] \}}|js||fqSr)r)rrQr`rrr ms z,ProcessInfo.update_stats..FT) rrArr[rr;rdictr_rr!r)rrrQr` nr_threadsrrrrhs  zProcessInfo.update_statsN)rrrrr3rrrrrrrrrrrrrrrs    rc@sDeZdZddZddZddZddZd d Zd d Zd dZ dS) ProcessListcCs2i|_||_||_t|_t|_|dSr) rrrGrr timestamprrupdate_process_counts)rrrGrrrr3~s    zProcessList.__init__cCs8|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)rrrrrG)rrprocessrrr get_processs  zProcessList.get_processc Cs|jjr|jjStd}|jjrdd|DSg}|D]+}d|dkr*dkrGnqz|tttd|dWqtyFYqwq|S) Nz/proccSs0g|]}d|dkrdkrnnt|qS)0r9)rk)rrrrrrs0z*ProcessList.list_tgids..rrrz/proc/z/task) rGrrlistdirrextendmaprkrX)rtgidstidsrrrr list_tgidss"  zProcessList.list_tgidscCsh|jjs|gSzttttd|}Wn ty gYSw|jjr2tt |jj t |}|S)Nz /proc/%d/task) rGrlistrrkrrrXrr intersection)rrrrrr list_tidss zProcessList.list_tidsc Cst}||j|_||_d}}|D]6}||}|sq||D]&}|||j}|j |}|rJ| ||j } || j 7}|| j 7}d|_q$q||f|jfS)NrF)rrrdurationrrrrrrgrrr#r%rrr<) r new_timestamp total_read total_writerrrQr`r?r<rrrrs(        z!ProcessList.update_process_countscCsL|jD] }|jD]}d|_q q|}tdd|jD|_|S)NTcSs g|] \}}|r||fqSr)r)rrrrrrrs z1ProcessList.refresh_processes..)rrrrrrr[)rrr`total_read_and_writerrrrefresh_processess zProcessList.refresh_processescCs i|_dSr)rrrrrclears zProcessList.clearN) rrrr3rrrrrrrrrrr}s   r)2 __future__rrYrrrmrr+rqrhasattrr ImportError RuntimeErrorpathexists ioaccounting iotop.vmstatrvmstat_frvm_event_countersrpruiotoprr iotop.netlinkrr r r iotop.genetlinkr r objectrrrOrPr\TASKSTATS_TYPE_PIDr^rErzrrrrrrrrrsf          5*