磁盘性能测量

工具一:iops, 一个python写的脚本

用法示例:sudo ./iops --num_threads 1 --time 2 /dev/md1

出处:http://benjamin-schweizer.de/measuring-disk-io-performance.html

代码:http://benjamin-schweizer.de/files/iops/iops-2011-02-11

#!/usr/bin/env python
#
# Copyright (c) 2008-2011 Benjamin Schweizer and others.
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
#
# Abstract
# ~~~~~~~~
# Benchmark disk IOs
#
# Authors
# ~~~~~~~
# Benjamin Schweizer, http://benjamin-schweizer.de/contact
# Uwe Menges
# John Keith Hohm <john at hohm dot net>
#
# Changes
# ~~~~~~~
# 2011-02-10, john: added win32 support
# 2010-09-13, benjamin: increased num_threads default to 32 (max-ncq)
# 2010-09-01, benjamin: ioctl cleanup, improved freebsd support
# 2010-08-12, benjamin/uwe: added multi-threading support
# 2010-07-22, benjamin: fixed 32bit ioctls on bsd
# 2010-07-21, benjamin: freebsd/osx support, switched to isc license
# 2009-09-16, uwe: changed formatting, fixed last block bug
# 2008-10-16, benjamin: initial release
#
# Todo
# ~~~~
# - check/add netbsd/openbsd mediasize ioctls
#

USAGE = """Copyright (c) 2008-2011 Benjamin Schweizer and others.

usage:

    iops [-n|--num_threads threads] [-t|--time time] <device>

    threads := number of concurrent io threads, default 1
    time    := time in seconds, default 10
    device  := some block device, like /dev/sda or \\\\.\\PhysicalDrive0

example:

    iops /dev/sda
    iops -n 8 -t 2 /dev/disk0

"""

import sys
import array
import struct
import random
import time
import threading

def mediasize(dev):
    """report the media size for a device, platform specific code"""
    # caching
    global _mediasizes
    if not ‘_mediasizes‘ in globals(): _mediasizes = {}
    if dev in _mediasizes:
        return _mediasizes[dev]

    mediasize = 0 # bytes

    if sys.platform == ‘darwin‘:
        # mac os x ioctl from sys/disk.h
        import fcntl
        DKIOCGETBLOCKSIZE = 0x40046418  # _IOR(‘d‘, 24, uint32_t)
        DKIOCGETBLOCKCOUNT = 0x40086419 # _IOR(‘d‘, 25, uint64_t)

        fh = open(dev, ‘r‘)
        buf = array.array(‘B‘, range(0,4))  # uint32
        r = fcntl.ioctl(fh.fileno(), DKIOCGETBLOCKSIZE, buf, 1)
        blocksize = struct.unpack(‘I‘, buf)[0]
        buf = array.array(‘B‘, range(0,8))  # uint64
        r = fcntl.ioctl(fh.fileno(), DKIOCGETBLOCKCOUNT, buf, 1)
        blockcount = struct.unpack(‘Q‘, buf)[0]
        fh.close()
        mediasize = blocksize*blockcount

    elif sys.platform.startswith(‘freebsd‘):
        # freebsd ioctl from sys/disk.h
        import fcntl
        DIOCGMEDIASIZE = 0x40086481 # _IOR(‘d‘, 129, uint64_t)

        fh = open(dev, ‘r‘)
        buf = array.array(‘B‘, range(0,8))  # off_t / int64
        r = fcntl.ioctl(fh.fileno(), DIOCGMEDIASIZE, buf, 1)
        mediasize = struct.unpack(‘q‘, buf)[0]
        fh.close()

    elif sys.platform == ‘win32‘:
        # win32 ioctl from winioctl.h, requires pywin32
        try:
            import win32file
        except ImportError:
            raise SystemExit("Package pywin32 not found, see http://sf.net/projects/pywin32/")
        IOCTL_DISK_GET_DRIVE_GEOMETRY = 0x00070000
        dh = win32file.CreateFile(dev, 0, win32file.FILE_SHARE_READ, None, win32file.OPEN_EXISTING, 0, None)
        info = win32file.DeviceIoControl(dh, IOCTL_DISK_GET_DRIVE_GEOMETRY, ‘‘, 24)
        win32file.CloseHandle(dh)
        (cyl_lo, cyl_hi, media_type, tps, spt, bps) = struct.unpack(‘6L‘, info)
        mediasize = ((cyl_hi << 32) + cyl_lo) * tps * spt * bps

    else: # linux or compat
        # linux 2.6 lseek from fcntl.h
        SEEK_SET=0
        SEEK_CUR=1
        SEEK_END=2

        fh = open(dev, ‘r‘)
        fh.seek(0,SEEK_END)
        mediasize = fh.tell()
        fh.close()

    if not mediasize:
        raise Exception("cannot determine media size")

    _mediasizes[dev] = mediasize
    return mediasize

def greek(value, precision=0, prefix=None):
    """Return a string representing the IEC or SI suffix of a value"""
    # Copyright (c) 1999 Martin Pohl, copied from
    # http://mail.python.org/pipermail/python-list/1999-December/018519.html
    if prefix:
        # Use SI (10-based) units
        _abbrevs = [
            (10**15, ‘P‘),
            (10**12, ‘T‘),
            (10** 9, ‘G‘),
            (10** 6, ‘M‘),
            (10** 3, ‘k‘),
            (1     , ‘ ‘)
        ]
    else:
        # Use IEC (2-based) units
        _abbrevs = [
            (1<<50L, ‘Pi‘),
            (1<<40L, ‘Ti‘),
            (1<<30L, ‘Gi‘),
            (1<<20L, ‘Mi‘),
            (1<<10L, ‘Ki‘),
            (1     , ‘  ‘)
        ]

    for factor, suffix in _abbrevs:
        if value >= factor:
            break

    if precision == 0:
        return "%3.d %s" % (int(value/factor), suffix)
    else:
        fmt="%%%d.%df %%s" % (4+precision, precision)
        return fmt % (float(value)/factor, suffix)

def iops(dev, blocksize=512, t=10):
    """measure input/output operations per second
    Perform random 512b aligned reads of blocksize bytes on fh for t seconds
    and print a stats line
    Returns: IOs/s
    """

    fh = open(dev, ‘r‘)
    count = 0
    start = time.time()
    while time.time() < start+t:
        count += 1
        pos = random.randint(0, mediasize(dev) - blocksize) # need at least one block left
        pos &= ~0x1ff   # freebsd8: pos needs 512B sector alignment
        fh.seek(pos)
        blockdata = fh.read(blocksize)
    end = time.time()

    t = end - start

    fh.close()

    return count/t

if __name__ == ‘__main__‘:
    # parse cli
    t = 10
    num_threads = 32
    dev = None

    if len(sys.argv) < 2:
        raise SystemExit(USAGE)

    while sys.argv:
        arg = sys.argv.pop(0)
        if arg in [‘-n‘, ‘--num-threads‘]:
            num_threads = int(sys.argv.pop(0))
        elif arg in [‘-t‘, ‘--time‘]:
            t = int(sys.argv.pop(0))
        else:
            dev = arg

    # run benchmark
    blocksize = 512
    try:
        print "%s, %sB, %d threads:" % (dev, greek(mediasize(dev), 2, ‘si‘), num_threads)
        _iops = num_threads+1 # initial loop
        while _iops > num_threads and blocksize < mediasize(dev):
            # threading boilerplate
            threads = []
            results = []

            def results_wrap(results, func, *__args, **__kw):
                """collect return values from func"""
                result = func(*__args, **__kw)
                results.append(result)

            for i in range(0, num_threads):
                _t = threading.Thread(target=results_wrap, args=(results, iops, dev, blocksize, t,))
                _t.start()
                threads.append(_t)

            for _t in threads:
                _t.join()
            _iops = sum(results)

            bandwidth = int(blocksize*_iops)
            print " %sB blocks: %6.1f IO/s, %sB/s (%sbit/s)" % (greek(blocksize), _iops,
                greek(bandwidth, 1), greek(8*bandwidth, 1, ‘si‘))

            blocksize *= 2
    except IOError, (err_no, err_str):
        raise SystemExit(err_str)
    except KeyboardInterrupt:
        print "caught ctrl-c, bye."

# eof.

工具二:fio  http://www.freecode.com/projects/fio/

用法略复杂,功能强大

时间: 2024-10-29 02:30:02

磁盘性能测量的相关文章

linux安装,磁盘分区方法

创建linux逻辑卷原因,在于能够随时后期增加扩盘 1.分区时选择"创建自定义分区" 2.创建标准分区(standard partition) 选择/boot目录创建固定大小(200M) /boot目录存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件. 3.创建逻辑卷 选择最后一个全部大小 4.选择逻辑卷基础,创建逻辑卷组 5.添加/home,/opt swap,/分区 OK,恭喜你,逻辑卷已经创建完成了,以后可以通过添加磁盘来扩展分区了

Linux性能优化之磁盘优化(三)

前言 关于本章内容,设计的东西比较多.这里会有关于文件系统.磁盘.CPU等方面的知识,以及涉及到关于这方面的性能排查等. 术语 文件系统通过缓存和缓冲以及异步I/O等手段来缓和磁盘的延时对应用程序的影响.为了更详细的了解文件系统,以下就简单介绍一些相关术语: 文件系统:一种把数据组织成文件和目录的存储方式,提供了基于文件的存取接口,并通过文件权限控制访问.另外,一些表示设备.套接字和管道的特殊文件类型,以及包含文件访问时间戳的元数据. 文件系统缓存:主存(通常是DRAM) 的一块区域,用来缓存文

LINUX磁盘管理

三周第五次课(8月18日) 4.5/4.6 磁盘格式化 4.7/4.8 磁盘挂载 4.9 手动增加swap空间 4.5/4.6 磁盘格式化 cat /etc/filesystem:查看支持的文件系统 1 mount 查看文件系统的格式 cent7默认的是使用xfs文件系统. cent默认使用ext 4.7/4.8 磁盘挂载格式化: mke2fs -t xfs -b /dev/sdb -b:指定块大小 ll查看的是文件的真正的大小 du -sh查看的是文件占用的块大小. du -sb 和ll效果一

RH124-14 文件系统和磁盘设备管理

第十四章 文件系统和磁盘设备管理 14.1 文件系统和磁盘设备的管理与使用 磁盘设备 磁盘设备是支持随机读写数据的设备. 在物理机器上,设备文件默认都存放在/dev/目录下,第一个硬盘是/dev/sda,第二个硬盘是/dev/sdb,如此类推.第一个硬盘的第一个分区是/dev/sda1,第二个分区是/dev/sda2,如此类推. 在xen或kvm的虚拟机上,硬盘的名字则是/dev/xvda或/dev/vda等,如此类推 有些存放数据的设备并不是直接硬件对应的设备文件,而是通过软件生成的块设备文件

仿网易云音乐播放器(磁盘转圈、背景虚化等等)

先看效果,CSDN的git传上去总是不动.不知道为什么. 主要思路: 1 . 除了 開始/暂停 .上一首.下一首 这三个icon.你看到的是一个ViewGroup ,这个ViewGroup里面有圆形封面.黑色圈圈磁盘.唱针,高斯模糊背景图 2. 凝视掉了磁盘一起转动的效果,如今的方案不是最好的,建议若是想实现,能够把圆形封面和磁盘合并成一张图(最好在CicicleImageView这里面做).给一个旋转动画.两个动画.两个View,帧的频率不会那么高 3.凝视掉了上一首.下一首切换的时候渐变的动

磁盘配额步骤简要

磁盘配额: 磁盘配额就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间. 基本上在linux中可用的地方那就是用户的家目录了,可以对用户进行限额配制,避免用户将恶意或不小心将磁盘写满. 1.现在我在我的这台机器中需要给用户配额,首先我将/home目录备份一下,以免接下来操作失误,而出现数据丢失的情况. cp /home/* /backuphome 2.接下就是创建分区并格式化 fdisk /dev/sdc mkfs.ext4 /dev/sdc1 将格式化

VMWare ESXi 6 创建共享磁盘

目的:创建4块10G大小共享磁盘,挂载到rhel-6.5-node1.rhel-6.5-node2服务器上 1.在rhel-6.5-node1上添加磁盘 2.选择"创建新的虚拟磁盘" 3.设置容量.磁盘置备和位置 4.选择虚拟设备节点为SCSI(1:0),模式 4.添加完成 5.添加按步骤1-4添加另外三块磁盘,虚拟设备节点依次为SCSI(1:1),SCSI(2:0).SCSI(2:1) 6.设置2块新的SCSI控制器SCSI总线共享为"虚拟" 7.在rhel-6.

linux磁盘挂载

参考:http://www.linuxidc.com/Linux/2011-02/32083.htm (3)启动VMware环境下的Linux操作系统,添加新分区,需要root账号身份. 3.1 [fdisk -l] 最大分区为/dev/sda3,说明新创建的分区将会是sda4 3.2 输入[fdisk /dev/sda] 3.2.1命令行提示下输入[m] 3.2.2输入命令[n]添加新分区. 3.2.3输入命令[p]创建主分区. 3.2.4输入[回车],选择默认大小,这样不浪费空间 3.2.5

阿里云磁盘扩容踩坑总结

公司半年前上线一个新的项目,采购了一批阿里云主机,磁盘组成是40G系统盘+100G的数据盘,数据库采用MariaDB Galera Cluster集群部署,由于业务数据量快速增长,导致磁盘存储空间剩余量很少,急需要扩容,先总结整个项目规划中埋下的坑: 1.没有DBA对数据库的容量规划,而前期的运维人员采购时选用100G的SSD云盘: 2.数据库默认使用共享表空间,缺点是删除数据后不释放空间,当数据快速增长后,我们采取了先删除临时表数据的方式来尽量避免暴力扩容,争取在春节期间稳定,删除部分数据后,