Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일

C# - Process의 I/O 사용량을 보여주는 GetProcessIoCounters Win32 API

아래와 같은 질문이 있길래,

c#에서 현재프로그램에서 사용한 인터넷사용량 측정이 가능한가요?
; https://www.sysnet.pe.kr/3/0/5670

혹시나 싶어 검색하다가 GetProcessIoCounters API를 알게 되었습니다.

GetProcessIoCounters function (winbase.h)
; https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getprocessiocounters

C#에서의 사용은 다음과 같이 할 수 있는데요,

public struct IO_COUNTERS
{
    public ulong ReadOperationCount;
    public ulong WriteOperationCount;
    public ulong OtherOperationCount;
    public ulong ReadTransferCount;
    public ulong WriteTransferCount;
    public ulong OtherTransferCount;

    public override string ToString()
    {
        return $"# of read op: {ReadOperationCount}, # of write op: {WriteOperationCount}, # of other op: {OtherOperationCount} # of read-bytes: {ReadTransferCount}, # of write-bytes: {WriteTransferCount}, # of other-bytes: {OtherTransferCount}";
    }
}

internal class Program
{
    [DllImport("Kernel32.dll")]
    public static extern bool GetProcessIoCounters(IntPtr hProcess, out IO_COUNTERS lpIoCounters);

    static void Main(string[] args)
    {
        IntPtr handle = Process.GetCurrentProcess().Handle;
        GetProcessIoCounters(handle, out IO_COUNTERS counters);
        Console.WriteLine($"{counters}");
    }
}

/*
# of read op: 34, # of write op: 0, # of other op: 223 # of read-bytes: 89617, # of write-bytes: 0, # of other-bytes: 5390
*/

"all I/O operations"에 대한 정보를 수집할 수 있다고 하는데, 이에는 Console I/O도 포함이 됩니다. 그래서 다음과 같이 출력해 보면,

GetProcessIoCounters(handle, out IO_COUNTERS counters);
ulong oldWritten = counters.WriteTransferCount;

Console.WriteLine("Hello World!");

GetProcessIoCounters(handle, out counters);
Console.WriteLine(counters.WriteTransferCount - oldWritten);

// 출력 결과: 14

하필 저 순간에 디스크 I/O가 발생하지 않았다면 정확히 14가 나옵니다. 왜냐하면 "Hello World!" 12 바이트와 "\r\n" 2바이트를 합쳐 14바이트를 Console.WriteLine으로 출력했기 때문입니다.

재미있는 것은, Network I/O에도 이것이 적용되는 듯합니다. 대신 OtherTransferCount로 측정이 되는데요,

GetProcessIoCounters(handle, out IO_COUNTERS counters);
ulong oldWritten = counters.OtherTransferCount;

WebClient wc = new WebClient();
string text = wc.DownloadString("https://www.naver.com");

GetProcessIoCounters(handle, out counters);
Console.WriteLine(counters.OtherTransferCount - oldWritten);
Console.WriteLine($"text.length == {text.Length}");

/* 출력 결과
157880
text.length == 162914
*/

하지만, 이번에는 정확하게 떨어지지는 않습니다. 반면 우연히 저 값이 튀었다고 하기에는 값이 또 너무 큽니다. WebClient.DownloadString을 호출하지 않으면 대개의 경우 그냥 0이 나오기 때문입니다.

암튼, 딱히 GetProcessIoCounters를 이용해 특정 I/O에 대한 사용량을 알아낼 수는 없지만, 그래도 전체적인 I/O 성능 수치로는 써도 좋을 듯합니다. ^^

(첨부 파일은 이 글의 예제 코드를 포함합니다.)




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 6/19/2022]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 151  152  153  154  155  156  157  158  [159]  160  161  162  163  164  165  ...
NoWriterDateCnt.TitleFile(s)
1117정성태9/9/201127842제니퍼 .NET: 17. 제니퍼 닷넷 적용 사례 (2) - 웹 애플리케이션 hang의 원인을 알려주다.
1116정성태9/8/201159356Java: 2. 자바에서 "Microsoft SQL Server JDBC Driver" 사용하는 방법
1115정성태9/4/201132463Java: 1. 닷넷 개발자가 처음 실습해 본 서블릿
1114정성태9/4/201136974Math: 2. "Zhang Suen 알고리즘(세선화, Thinning/Skeletonization)"의 C# 버전 [4]파일 다운로드1
1113정성태9/2/201136537개발 환경 구성: 129. Hyper-V에 CentOS 설치하기
1112정성태9/2/201153193Linux: 1. 리눅스 <-> 윈도우 원격 접속 프로그램 사용 [3]
1111정성태8/29/201127293제니퍼 .NET: 16. 적용 사례 (1) - DB Connection Pooling을 사용하지 않았을 때의 성능 저하를 알려주다. [1]
1110정성태8/26/201128991오류 유형: 136. RDP 접속이 불연속적으로 끊기는 문제
1109정성태8/26/201131786오류 유형: 135. 어느 순간 Active Directory 접속이 안되는 문제
1108정성태8/22/201132379오류 유형: 134. OLE/COM Object Viewer - DllRegisterServer in IVIEWERS.DLL failed. [1]
1107정성태8/21/201131247디버깅 기술: 43. Windows Form의 Load 이벤트에서 발생하는 예외가 Visual Studio에서 잡히지 않는 문제
1106정성태8/20/201129840웹: 26. FailedRequestTracing 설정으로 인한 iisexpress.exe 비정상 종료 문제
1105정성태8/19/201129014.NET Framework: 238. Web Site Model 프로젝트에서 Trace.WriteLine 출력이 dbgview.exe에서 확인이 안 되는 문제파일 다운로드1
1104정성태8/19/201129637웹: 25. WebDev보다 IIS Express가 더 나은 점 - 다중 가상 디렉터리 매핑 [1]
1103정성태8/19/201135569오류 유형: 133. WCF 포트 바인딩 실패 오류 - TCP error(10013) [1]
1102정성태8/19/201132474Math: 1. 방탈출3 - Room 10의 '중복가능한 조합' 문제를 위한 C# 프로그래밍 [2]파일 다운로드1
1101정성태8/19/201132029.NET Framework: 237. WCF AJAX 서비스와 JavaScript 간의 DateTime 연동 [1]파일 다운로드1
1100정성태8/17/201131166.NET Framework: 236. SqlDbType - DateTime, DateTime2, DateTimeOffset의 차이점파일 다운로드1
1099정성태8/15/201130249오류 유형: 132. 어느 순간 갑자기 접속이 안 되는 TFS 서버
1098정성태8/15/201152544웹: 24. 네이버는 어떻게 로그인 처리를 할까요? [2]
1097정성태8/15/201123618.NET Framework: 235. 메서드의 메타 데이터 토큰 값으로 클래스를 찾아내는 방법
1096정성태8/15/201127815디버깅 기술: 42. Watson Bucket 정보를 이용한 CLR 응용 프로그램 예외 분석 - (2)
1095정성태8/14/201128140디버깅 기술: 41. Windbg - 비정상 종료된 닷넷 프로그램의 StackTrace에서 보이는 offset 값 의미
1094정성태8/14/201132680오류 유형: 131. Fiddler가 강제 종료된 경우, 웹 사이트 방문이 안되는 현상
1093정성태7/27/201126217오류 유형: 130. Unable to connect to the Microsoft Visual Studio Remote Debugging Monitor ... Access is denied.
1092정성태7/22/201128766Team Foundation Server: 46. 코드 이외의 파일에 대해 소스 제어에서 제외시키는 방법
... 151  152  153  154  155  156  157  158  [159]  160  161  162  163  164  165  ...