def perf_process_events(self, source, condition): had_events = True while had_events: had_events = False for cpu in self.cpu_map: event = self.evlist.read_on_cpu(cpu) if event: had_events = True if event.type == perf.RECORD_FORK: if event.pid == event.tid: try: self.ps.processes[event.pid] = procfs.process( event.pid) except: # short lived thread pass else: try: self.ps.processes[event.pid].threads.processes[ event.tid] = procfs.process(event.tid) except AttributeError: self.ps.processes[ event.pid].threads = procfs.pidstats( "/proc/%d/task/" % event.pid) elif event.type == perf.RECORD_EXIT: del self.ps[int(event.tid)] elif event.type == perf.RECORD_SAMPLE: tid = event.sample_tid if self.perf_counter.has_key(tid): self.perf_counter[tid] += event.sample_period else: self.perf_counter[tid] = event.sample_period self.show() return True
def perf_process_events(self, source, condition): had_events = True while had_events: had_events = False for cpu in self.cpu_map: event = self.evlist.read_on_cpu(cpu) if event: had_events = True if event.type == perf.RECORD_FORK: if event.pid == event.tid: try: self.ps.processes[event.pid] = procfs.process(event.pid) except: # short lived thread pass else: try: self.ps.processes[event.pid].threads.processes[event.tid] = procfs.process(event.tid) except AttributeError: self.ps.processes[event.pid].threads = procfs.pidstats("/proc/%d/task/" % event.pid) elif event.type == perf.RECORD_EXIT: del self.ps[int(event.tid)] elif event.type == perf.RECORD_SAMPLE: tid = event.sample_tid if self.perf_counter.has_key(tid): self.perf_counter[tid] += event.sample_period else: self.perf_counter[tid] = event.sample_period self.show() return True
def _affinity_changeable(self, pid): try: process = procfs.process(pid) if process["stat"].is_bound_to_cpu(): if process["stat"]["state"] == "Z": log.debug( "Affinity of zombie task with PID %d cannot be changed, the task's affinity mask is fixed." % pid) elif self._is_kthread(process): log.debug( "Affinity of kernel thread with PID %d cannot be changed, the task's affinity mask is fixed." % pid) else: log.warn( "Affinity of task with PID %d cannot be changed, the task's affinity mask is fixed." % pid) return 0 else: return 1 except (OSError, IOError) as e: if e.errno == errno.ENOENT or e.errno == errno.ESRCH: log.debug( "Failed to get task info for PID %d, the task vanished." % pid) return -1 else: log.error("Failed to get task info for PID %d: %s" % (pid, e)) return -2 except (AttributeError, KeyError) as e: log.error("Failed to get task info for PID %d: %s" % (pid, e)) return -2
def _affinity_changeable(self, pid, process=None): try: if process is None: process = procfs.process(pid) if process["stat"].is_bound_to_cpu(): if process["stat"]["state"] == "Z": log.debug( "Affinity of zombie task with PID %s cannot be changed, the task's affinity mask is fixed." % pid) elif len(process["cmdline"]) == 0: log.debug( "Affinity of kernel thread with PID %s cannot be changed, the task's affinity mask is fixed." % pid) else: log.warn( "Affinity of task with PID %s cannot be changed, the task's affinity mask is fixed." % pid) return 0 else: return 1 except IOError as e: if e[0] == errno.ENOENT or e[0] == errno.ESRCH: log.debug( "Unable to set affinity for PID %s, the task vanished." % pid) return -1 else: log.error("Failed to get task info for PID %s: %s" % (pid, str(e))) return -2 except (OSError, AttributeError, KeyError) as e: log.error("Failed to get task info for PID %s: %s" % (pid, str(e))) return -2
def _get_cmdline(self, process): if not isinstance(process, procfs.process): pid = process process = procfs.process(pid) cmdline = procfs.process_cmdline(process) if self._is_kthread(process): cmdline = "[" + cmdline + "]" return cmdline