1#!/usr/bin/env python3 2# Copyright (c) PLUMgrid, Inc. 3# Licensed under the Apache License, Version 2.0 (the "License") 4 5from ctypes import c_uint, c_ulong, Structure 6from bcc import BPF 7from time import sleep 8import sys 9from unittest import main, TestCase 10from utils import mayFail 11 12arg1 = sys.argv.pop(1).encode() 13arg2 = b"" 14if len(sys.argv) > 1: 15 arg2 = sys.argv.pop(1) 16 17 18class TestBlkRequest(TestCase): 19 def setUp(self): 20 b = BPF(arg1, arg2, debug=0) 21 self.latency = b.get_table(b"latency", c_uint, c_ulong) 22 if BPF.get_kprobe_functions(b"blk_start_request"): 23 b.attach_kprobe(event=b"blk_start_request", 24 fn_name=b"probe_blk_start_request") 25 b.attach_kprobe(event=b"blk_mq_start_request", 26 fn_name=b"probe_blk_start_request") 27 b.attach_kprobe(event=b"blk_update_request", 28 fn_name=b"probe_blk_update_request") 29 30 def test_blk1(self): 31 import subprocess 32 import os 33 # use /opt instead of /tmp so that it hits a real disk 34 for i in range(0, 2): 35 subprocess.call(["dd", "if=/dev/zero", "of=/opt/trace3.txt", 36 "count=1024", "bs=4096"]) 37 subprocess.call(["sync"]) 38 os.unlink("/opt/trace3.txt") 39 for key, leaf in self.latency.items(): 40 print("latency %u:" % key.value, "count %u" % leaf.value) 41 sys.stdout.flush() 42 self.assertEqual(len(list(self.latency.keys())), len(self.latency)) 43 44if __name__ == "__main__": 45 main() 46