linux的 iostat 找出哪个进程占据了大量IO

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux的 iostat 找出哪个进程占据了大量IO相关的知识,希望对你有一定的参考价值。

Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
sda 110.65 1554.14 258.76 54.77 17656.99 12871.93 97.37 40.13 127.90 3.05 95.73

这是 iostat -dx 的结果,如何找出是哪个进程占用了最大的磁盘IO

iostat实时查看不如iotop,iotop用了直观反映你的需求
# iotop
参考技术A 安装iotop命令 参考技术B await 选项值 参考技术C $ sudo iotop

Swift - 找出哪个表格视图单元占据了大部分屏幕

【中文标题】Swift - 找出哪个表格视图单元占据了大部分屏幕【英文标题】:Swift - find out which table view cell occupies most of screen 【发布时间】:2016-01-20 12:09:03 【问题描述】:

我有这个表格视图,其表格视图单元格具有屏幕的宽度和高度。每个显示一个图像。 当您滚动表格视图时,您可以让一个表格视图单元格占据整个屏幕。或者您最多可以同时在应用程序的屏幕上看到 2 个表格视图单元格。 我的问题是:有什么办法可以找出 2 个表格视图单元格中的哪一个比另一个占据更大的屏幕高度?

【问题讨论】:

【参考方案1】:

这是找出哪个单元格的可见度超过 60% 的简单方法。

func scrollViewDidScroll(scrollView: UIScrollView) 

    checkWhichVideoToEnable()


func checkWhichVideoToEnable() 

    for cell in tableView.visibleCells as [UITableViewCell] 

        if cell.isKindOfClass(UITableViewCell) 

            let indexPath = tableView.indexPathForCell(cell)
            let cellRect = tableView.rectForRowAtIndexPath(indexPath!)
            let superView = tableView.superview

            let convertedRect = tableView.convertRect(cellRect, toView: superView)
            let intersect = CGRectIntersection(tableView.frame, convertedRect)
            let visibleHeight = CGRectGetHeight(intersect)

            if visibleHeight > self.view.bounds.size.height * 0.6   // only if 60% of the cell is visible.

                //cell is visible more than 60%
                print(indexPath?.row) //your visible cell.
            
        
    

来自HERE的参考。

【讨论】:

【参考方案2】:

查看第二个可见单元格 (tableView.visibleCells[1]) 并检查其 y 位置。如果它小于 tableView 高度的一半,它会占用更多的屏幕,否则会更少。随心所欲地打破关系。

编辑

给定 indexPath 的 y 位置是固定的,因此您需要考虑 tableView 的 contentOffset

CGFloat yOrigin = [tableView.visibleCells[1] frame].origin.y - tableView.contentOffset.y;

【讨论】:

我试过这样: print(tableView.visibleCells[0].frame.origin.y) print(tableView.visibleCells[1].frame.origin.y) 无论我如何移动屏幕上的 2 个单元格(更高或更低),对于前 2 个单元格,我得到:568 和 1136,而对于第二个和第三个单元格,我得到 1136 和 1704。看起来更多或更少屏幕并不重要,框架.origin.y 不会改变。 对。您必须考虑到 tableView 的 contentOffset。我会更新我的答案。 这是因为 view.fram 总是引用超级视图的内部坐标系。您可以将坐标转换为 self.view 的坐标。 UIView 具有用于点转换的内置方法。您也可以将其转换为主窗口或设备坐标,但是当应用旋转加上设备的原点 (0.0) 与 UIKit 坐标系统不同时,这可能会非常混乱。 工作完美,Avi!谢谢!为 Swift 写了这样的代码: let yOrigin1: CGFloat = tableView.visibleCells[0].frame.origin.y - tableView.contentOffset.y let yOrigin2: CGFloat = tableView.visibleCells[1].frame.origin.y - tableView。 contentOffset.y print("-------- (yOrigin1)") print("-------- (yOrigin2)") 这是来自@matt 的 GRRRRREAT 答案,并附有 ***.com/a/68109661/4833705 的动画。它适用于水平单元格,但应该很容易将其更改为使用垂直单元格【参考方案3】:

您也许可以尝试获取 tableView 的 visibleCells 并检查这些单元格的来源。由于您随时都会有 2 个可见单元格,因此比较它们各自框架的 y 值可以告诉您哪个占据更多高度

【讨论】:

我试过这样: print(tableView.visibleCells[0].frame.origin.y) print(tableView.visibleCells[1].frame.origin.y) 无论我如何移动屏幕上的 2 个单元格(更高或更低),对于前 2 个单元格,我得到:568 和 1136,而对于第二个和第三个单元格,我得到 1136 和 1704。看起来更多或更少屏幕并不重要,框架.origin.y 不会改变。

以上是关于linux的 iostat 找出哪个进程占据了大量IO的主要内容,如果未能解决你的问题,请参考以下文章

sh Linux:找出哪个进程正在侦听端口

Linux服务器病毒清理实践

linux性能监控工具介绍

如何查看Linux下进程的IO活动状况 00 Hey,Linux

Linux工具参考篇(网摘)

什么进程正在使用我所有的磁盘 IO [关闭]