summaryrefslogtreecommitdiff
path: root/docs/DEVNOTES
blob: 915754d67ac25128afb2a13a77a400b8dbb1d33a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
TODO
====

A collection of ideas and notes about stuff to implement in future versions.
"#NNN" occurrences refer to bug tracker issues at:
https://github.com/giampaolo/psutil/issues

PLATFORMS
=========

- #355: Android (with patch)
- #82: Cygwin (PR at #998)
- #276: GNU/Hurd
- #693: Windows Nano
- #1251: Windows bash
- DragonFlyBSD
- HP-UX

FEATURES
========

- set process name/title

- #1115: users() idle time.

- #1102: Process.is64bit().

- #371: sensors_temperatures() at least for macOS.

- #669: Windows / net_if_addrs(): return broadcast addr.

- #550: CPU info (frequency, architecture, threads per core, cores per socket,
  sockets, ...)

- #772: extended net_io_counters() metrics.

- #922: extended net_io_stats() info.

- #914: extended platform specific process info.

- #898: wifi stats

- (UNIX) process root (different from cwd)

- #782: (UNIX) process num of signals received.

- (Linux) locked files via /proc/locks:
  https://www.centos.org/docs/5/html/5.2/Deployment_Guide/s2-proc-locks.html

- #269: NIC rx/tx queue. This should probably go into net_if_stats().
  Figure out on what platforms this is supported:
  Linux: yes
  Others: ?

- Process.threads(): thread names; patch for macOS available at:
  https://code.google.com/p/plcrashreporter/issues/detail?id=65
  Sample code:
  https://github.com/janmojzis/pstree/blob/master/proc_kvm.c

- Asynchronous psutil.Popen (see http://bugs.python.org/issue1191964)

- (Windows) fall back on using WMIC for Process methods returning AccessDenied

- #613: thread names.

- scripts/taskmgr-gui.py (using tk).

- system-wide number of open file descriptors:
  - https://jira.hyperic.com/browse/SIGAR-30

- Number of system threads.
  - Windows: http://msdn.microsoft.com/en-us/library/windows/desktop/ms684824(v=vs.85).aspx

- Doc / wiki which compares similarities between UNIX cli tools and psutil.
  Example:
  ```
  df -a  ->  psutil.disk_partitions
  lsof  ->  psutil.Process.open_files() and psutil.Process.open_connections()
  killall->  (actual script)
  tty  ->  psutil.Process.terminal()
  who  ->  psutil.users()
  ```

- psutil.proc_tree() something which obtains a {pid:ppid, ...} dict for
  all running processes in one shot. This can be factored out from
  Process.children() and exposed as a first class function.
  PROS: on Windows we can take advantage of _psutil_windows.ppid_map()
  which is faster than iterating over all pids and calling ppid().
  CONS: scripts/pstree.py shows this can be easily done in the user code
  so maybe it's not worth the addition.

- advanced cmdline interface exposing the whole API and providing different
  kind of outputs (e.g. pprinted, colorized, json).

- [Linux]: process cgroups (http://en.wikipedia.org/wiki/Cgroups). They look
  similar to prlimit() in terms of functionality but uglier (they should allow
  limiting per-process network IO resources though, which is great). Needs
  further reading.

- Python 3.3. exposed different sched.h functions:
  http://docs.python.org/dev/whatsnew/3.3.html#os
  http://bugs.python.org/issue12655
  http://docs.python.org/dev/library/os.html#interface-to-the-scheduler
  It might be worth to take a look and figure out whether we can include some
  of those in psutil.
  Also, we can probably reimplement wait_pid() on POSIX which is currently
  implemented as a busy-loop.

- os.times() provides 'elapsed' times (cpu_times() might).

- ...also guest_time and cguest_time on Linux.

- Enrich exception classes hierarchy on Python >= 3.3 / post PEP-3151 so that:
   - NoSuchProcess inherits from ProcessLookupError
   - AccessDenied inherits from PermissionError
   - TimeoutExpired inherits from TimeoutError (debatable)
   See: http://docs.python.org/3/library/exceptions.html#os-exceptions

- Process.threads() might grow an extra "id" parameter so that it can be
   used as such:
  ```
  >>> p = psutil.Process(os.getpid())
  >>> p.threads(id=psutil.current_thread_id())
  thread(id=2539, user_time=0.03, system_time=0.02)
  >>>
  ```
  Note: this leads to questions such as "should we have a custom NoSuchThread
  exception? Also see issue #418.
  Note #2: this would work with os.getpid() only.
  psutil.current_thread_id() might be desirable as per issue #418 though.

- should psutil.TimeoutExpired exception have a 'msg' kwarg similar to
  NoSuchProcess and AccessDenied? Not that we need it, but currently we
  cannot raise a TimeoutExpired exception with a specific error string.

- process_iter() might grow an "attrs" parameter similar to Process.as_dict()
  invoke the necessary methods and include the results into a "cache"
  attribute attached to the returned Process instances so that one can avoid
  catching NSP and AccessDenied:
  for p in process_iter(attrs=['cpu_percent']):
  print(p.cache['cpu_percent'])
  This also leads questions as whether we should introduce a sorting order.

- round Process.memory_percent() result?

- #550: number of threads per core.

- cpu_percent() and cpu_times_percent() use global vars so are not thread safe.

BUGFIXES
========

- #600: windows / open_files(): support network file handles.

REJECTED IDEAS
==============

- #550: threads per core
- #1667: process_iter(new_only=True)

INCONSISTENCIES
===============

- disk_partitions(all=False) should have been "perdisk=False" instead:
  * disk_io_counters(perdisk=False)
  * net_io_counters(pernic=False)
  * cpu_times_percent(percpu=False)
  * cpu_times(percpu=False)
  * cpu_freq(percpu=False)
- PROCFS_PATH should have been set_procfs_path()

RESOURCES
=========

- sigar: https://github.com/hyperic/sigar (Java)
- zabbix: https://zabbix.org/wiki/Get_Zabbix
- libstatgrab: http://www.i-scream.org/libstatgrab/
- top: http://www.unixtop.org/
- oshi: https://github.com/oshi/oshi
- netdata: https://github.com/netdata/netdata