리눅스에서 cpu점유 구하기 질문요~

sangwou의 이미지

cpu점유율을 구할려고 하는데...
user 모드 사용율 = (user모드 / cpu 전체값) * 100
이공식대로 구했는데... 값이 변화가 없네요 ㅠㅠ
이전값을 가지고 서로의 차를 이용해서 하는것 까지 알았습니다 근데 구현이 어렵네요
도움좀 부탁합니다~ 소스가 구현된곳이 아니래도 참고할수있는 싸이트래도 링크해주시면 감사하겠습니다..

혹시 다른방식으로 cpu점유율을 가지고 올방법 없나요? vmtest나 sar이용해서 래도....

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class Good
{
long total = 0;
long idle = 0;

double usage = 0;

public Good( )
{
readUsage( );
}

public double getUsage( )
{
readUsage( );
return usage;
}

private void readUsage( )
{
try
{
BufferedReader reader = new BufferedReader( new InputStreamReader( new FileInputStream( "/proc/stat" ) ), 1000 );
String load = reader.readLine();
reader.close();

String[] toks = load.split(" ");
long currTotal = Long.parseLong(toks[2]) + Long.parseLong(toks[3]) + Long.parseLong(toks[4])+Long.parseLong(toks[5]);
long currIdle = Long.parseLong(toks[5]);

this.total = currTotal;
this.idle = currIdle;

this.usage = ((double)Long.parseLong(toks[4])/currTotal)*100;

System.out.println(" cpu사용률 : " + usage + "%");
}
catch( IOException ex )
{
ex.printStackTrace();
}
}
}

klyx의 이미지

proc아래를 읽어오는 것도 들어본적은 있는데, 개인적으로는 ps를 호출하여 구하고 있습니다.
ps -p pid -o pcpu
이렇게 하면 pid의 프로세스의 cpu점유율이 %로 출력됩니다(터미널에서 해보세요).
이렇게해서 얻는 내용을 파싱(이라고 할 것도 없을 만큼 간단하지만)해서 점유율 숫자만 읽어오는 방식으로 구현했습니다.
양쪽다 해본건 아니라 어느쪽이 더 간단하다고 하기는 힘든데, 저는 pcpu,rss,pmem 옵션을 지정해서 점유율, 메모리 사용량, 메모리 점유율만 동시에 뽑아서 쓰고 있습니다.
전 자바를 안써서 구체적인 예제를 보여드리긴 힘들지만, 자바도 명령어 실행해서 표준출력읽어건 가능할테니 구현하는것도 가능할 듯합니다.

jemiro의 이미지

위의 코드로는 시피유 사용률 계산이 틀려 보입니다.

/proc/stat 를 계속 읽어 보시면 아시겠지만 그 값이 계속 증가합니다.
그 이유가 /proc/stat 에는 리눅스 시스템의 부팅후 현재 시간까지의 각각 항목의 시피유 사용 누적 값이기 때문입니다.

구해야 하는 시피유 사용률이라고 하는것은 보통 몇초 동안의 시피유 사용률(%) 입니다.
즉 몇초 라는 개념을 넣어서 코드를 만들어주어야 됩니다.

예를 들어 3초간 이라고 간격을 설정했다고 보면,
/proc/stat를 한번 읽고 3초후에 다시 읽어서,
그차이 값을 가지고 %를 구해주면 3초간의 사용률이 나오겠죠.

코드가 좀 어렵긴 하겠지만 top 소스를 읽어보시면 도움이 되실꺼에요.
(오픈소스라 소스는 쉽게 구할수 있습니다.)

익명 사용자의 이미지

public void MatrixTime(int delayTime) {
long saveTime = System.currentTimeMillis();
long currTime = 0;

while (currTime - saveTime < delayTime) {

currTime = System.currentTimeMillis();
}
}

public void getCpuStatFromFile(long[] value) {
ProcessBuilder cmd;
String tempStr = null;
try {
String[] args = { "/system/bin/cat", "/proc/stat" };
cmd = new ProcessBuilder(args);
java.lang.Process process = cmd.start();
InputStream in = process.getInputStream();
byte[] re = new byte[1024];
in.read(re);
tempStr = new String(re);
StringTokenizer st = new StringTokenizer(tempStr, " ");
String arrPrint[] = new String[st.countTokens()];

int i = 0;
for (int k = 0; st.hasMoreTokens(); k++) {
arrPrint[k] = st.nextToken();
if (k == 0)
continue;
value[i] = Long.parseLong(arrPrint[k]);

i++;
if (k == 6)
break;
}

in.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}

public double[] calculateCpu() {
long prev_cpu[] = new long[10];
long cur_cpu[] = new long[10];
long calc_cpu[] = new long[5];
double value[] = new double[5];
long total = 0;
getCpuStatFromFile(prev_cpu);

MatrixTime(1000);
getCpuStatFromFile(cur_cpu);

for (int k = 0; k < 5; k++) {

calc_cpu[k] = cur_cpu[k] - prev_cpu[k];
total += calc_cpu[k];
}

for (int k = 0; k < 5; k++) {

value[k] = 100 * calc_cpu[k] / (double) total;
}

return value;

}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.