Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

disk_io_counters() - linux: mimic iostat behavior #1313

Merged
merged 4 commits into from
Jul 28, 2018

Conversation

giampaolo
Copy link
Owner

Re: #1244, #1305, #1312.

@giampaolo
Copy link
Owner Author

giampaolo commented Jul 28, 2018

@wiggin15 this is a competing PR re. your #1312. The fundamental difference is that:

This is what iostat does basically.

With that said, I'm still not completely sure this is the desired behavior as we're losing information (the partitions). For example, on my machine:

$ iostat
...
loop7             0,02         0,02         0,00      19161          0
nvme0n1           7,44        46,64       419,57   44357716  399041042
loop8             0,00         0,00         0,00       1820          0
...

$ iostat -p
...
loop7             0,02         0,02         0,00      19161          0
nvme0n1           7,44        46,64       419,56   44357728  399044530
nvme0n1p1         0,00         0,01         0,00      13168          1
nvme0n1p2         0,85         3,88         3,82    3686381    3631544
nvme0n1p3         5,73        34,83       314,54   33122864  299158432
nvme0n1p4         0,75         7,91       101,20    7527576   96254553
loop8             0,00         0,00         0,00       1820          0
...

So far psutil used to show both base disks and partitions, mimicking iostat -p. With this change in place and #1312 it will not, and I'm not sure this is what we want as we're losing info which can potentially be useful. I think the best compromise is to include partitions when perdisk=True is passed (more available info) else skip them in order to avoid counting disk + partition(s) twice.

@wiggin15 does it make sense to you?

PS: another aspect is that we're also returning virtual partitions (e.g. "loop8"). One may argue there should be a switch to skip them but I don't want to complicate disk_io_counters() API by adding a parameter which only applies to Linux.

@wiggin15
Copy link
Collaborator

With this change in place and #1312 it will not

Actually, my patch retains the partition information (still more like iostat -p). The problem with #1312 is that it always ignores parent devices if they have partitions.

So, this PR always strips partition information, and #1312 always strips parent devices, regardless of perdisk.

Indeed, the best thing to do is probably return the partition information and if perdisk is False then skip devices that have partitions. This is pretty easy with #1312, but for that we need to pass perdisk to the platform modules - all disk_io_counters will have to get the perdisk parameter.

If we don't want to do that then it's your call - #1312 will return more information (more like today, except without the wrong multiple counting), and this PR will always strip partitions (but this PR is far simpler in terms of code).

@giampaolo giampaolo changed the title #1395 - disk_io_counters() - linux: mimick iostat behavior disk_io_counters() - linux: mimic iostat behavior Jul 28, 2018
@giampaolo
Copy link
Owner Author

Actually, my patch retains the partition information (still more like iostat -p). The problem with #1312 is that it always ignores parent devices if they have partitions. So, this PR always strips partition information, and #1312 always strips parent devices, regardless of perdisk.

Correct, sorry about the confusion.

Indeed, the best thing to do is probably return the partition information and if perdisk is False then skip devices that have partitions. This is pretty easy with #1312, but for that we need to pass perdisk to the platform modules - all disk_io_counters will have to get the perdisk parameter.

We have to pass perdisk parameter also with this PR. Not a big deal, it will just be ignored on other platforms.

If we don't want to do that then it's your call - #1312 will return more information (more like today, except without the wrong multiple counting), and this PR will always strip partitions (but this PR is far simpler in terms of code).

Yes it appears this one is simpler so I prefer to go along with it. Thanks for #1312 though, I appreciate it.

@giampaolo giampaolo merged commit 45c0ebc into master Jul 28, 2018
@giampaolo giampaolo deleted the linux-disk-io-partitions branch July 28, 2018 22:20
giampaolo added a commit that referenced this pull request Jul 28, 2018
nlevitt added a commit to nlevitt/psutil that referenced this pull request Apr 9, 2019
* origin/master: (182 commits)
  giampaolo#1394 / windows / process exe(): convert errno 0 into ERROR_ACCESS_DENIED; errno 0 occurs when the Python process runs in 'Virtual Secure Mode'
  pre-release
  fix win num_handles() test
  update readme
  fix giampaolo#1111: use a lock to make Process.oneshot() thread safe
  pdate HISTORY
  giampaolo#1373: different approach to oneshot() cache (pass Process instances around - which is faster)
  use PROCESS_QUERY_LIMITED_INFORMATION also for username()
  Linux: refactor _parse_stat_file() and return a dict instead of a list (+ maintainability)
  fix giampaolo#1357: do not expose Process' memory_maps() and io_counters() methods if not supported by the kernel
  giampaolo#1376 Windows: check if variable is NULL before free()ing it
  enforce lack of support for Win XP
  fix giampaolo#1370: improper usage of CloseHandle() may lead to override the original error code resulting in raising a wrong exception
  update HISTORY
  (Windows) use PROCESS_QUERY_LIMITED_INFORMATION access rights (giampaolo#1376)
  update HISTORY
  revert 5398c48; let's do it in a separate branch
  giampaolo#1111 make Process.oneshot() thread-safe
  sort HISTORY
  give CREDITS to @EccoTheFlintstone for giampaolo#1368
  fix ionice set not working on windows x64 due to LENGTH_MISMATCH  (giampaolo#1368)
  make flake8 happy
  give CREDITS to @amanusk for giampaolo#1369 / giampaolo#1352 and update doc
  Add CPU frequency support for FreeBSD (giampaolo#1369)
  giampaolo#1359: add test case for cpu_count(logical=False) against lscpu utility
  disable false positive mem test on travis + osx
  fix PEP8 style mistakes
  give credits to @koenkooi for giampaolo#1360
  Fix giampaolo#1354 [Linux] disk_io_counters() fails on Linux kernel 4.18+ (giampaolo#1360)
  giampaolo#1350: give credits to @amanusk
  FreeBSD adding temperature sensors (WIP) (giampaolo#1350)
  pre release
  sensors_temperatures() / linux: convert defaultdict to dict
  fix giampaolo#1004: Process.io_counters() may raise ValueError
  fix giampaolo#1307: [Linux] disk_partitions() does not honour PROCFS_PATH
  refactor hasattr() checks as global constants
  giampaolo#1197 / linux / cpu_freq(): parse /proc/cpuinfo in case /sys/devices/system/cpu fs is not available
  fix giampaolo#1277 / osx / virtual_memory: 'available' and 'used' memory were not calculated properly
  travis / osx: set py 3.6
  travis: disable pypy; se py 3.7 on osx
  skip test on PYPY + Travis
  fix travis
  fix giampaolo#715: do not print exception on import time in case cpu_times() fails.
  fix different travis failures
  give CREDITS for giampaolo#1320 to @truthbk
  [aix] improve compilation on AIX, better support for gcc/g++ + fix cpu metrics (giampaolo#1320)
  give credits to @alxchk for giampaolo#1346 (sunOS)
  Fix giampaolo#1346 (giampaolo#1347)
  giampaolo#1284, giampaolo#1345 - give credits to @amanusk
  Add parsing for /sys/class/thermal (giampaolo#1345)
  Fix decoding error in tests
  catch UnicodeEncodeError on print()
  use memory tolerance in occasionally failing test
  Fix random 0xC0000001 errors when querying for Connections (giampaolo#1335)
  Correct capitalization of PyPI (giampaolo#1337)
  giampaolo#1341: move open() utilities/wrappers in _common.py
  Refactored ps() function in test_posix (giampaolo#1341)
  fix giampaolo#1343: document Process.as_dict() attrs values
  giampaolo#1332 - update HISTORY
  make psutil_debug() aware of PSUTIL_DEBUG (giampaolo#1332)
  also include PYPY (or try to :P)
  travis: add python 3.7 build
  add download badge
  remove failing test assertions
  remove failing test
  make test more robust
  pre release
  pre release
  set version to 5.4.7
  OSX / SMC / sensors: revert giampaolo#1284 (giampaolo#1325)
  setup.py: add py 3.7
  fix giampaolo#1323: [Linux] sensors_temperatures() may fail with ValueError
  fix failing linux tests
  giampaolo#1321 add unit tests
  giampaolo#1321: refactoring
  make disk_io_counters more robust (giampaolo#1324)
  fix typo
  Fix DeprecationWarning: invalid escape sequence (giampaolo#1318)
  remove old test
  update is_storage_device() docstring
  fix giampaolo#1305 / disk_io_counters() / Linux: assume SECTOR_SIZE is a fixed 512
  giampaolo#1313 remove test which no longer makes sense
  disk_io_counters() - linux: mimic iostat behavior (giampaolo#1313)
  fix wrong reference link in doc
  disambiguate TESTFN for parallel testing
  fix giampaolo#1309: add STATUS_PARKED constant and fix STATUS_IDLE (both on linux)
  give CREDITS to @sylvainduchesne for giampaolo#1294
  retain GIL when querying connections table (giampaolo#1306)
  Update index.rst (giampaolo#1308)
  fix giampaolo#1279: catch and skip ENODEV in net_if_stat()
  appveyor: retire 3.5, add 3.7
  revert file renaming of macos files; get them back to 'osx' prefix
  winmake: add upload-wheels cmd
  Rename OSX to macOS (giampaolo#1298)
  apveyor: reset py 3.4 and remove 3.7 (not available yet)
  try to fix occasional children() failure on Win: https://ci.appveyor.com/project/giampaolo/psutil/build/job/je3qyldbb86ff66h
  appveyor: remove py 3.4 and add 3.7
  giampaolo#1284: give credits to @amanusk + some minor adjustments
  little refactoring
  Osx temps (giampaolo#1284)
  ...
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants