linux监控cpu和内存使用情况,发送邮件
2018年08月01日 16:06:45 阅读数:66更多
个人分类: Linux
目录
这几天老大安排做linux服务器的工具,又接了几个巨坑,不过还是get新技能点。
1.整体架构图

主要功能 :监控linux的cpu和内存使用率,当频率过高时,发送邮件提醒功能。
这里的SendMail工具类在上一章节写过,需要的朋友可以去看下,付链接
https://mp.youkuaiyun.com/postedit/81332504
还有一个发送邮件问题,在linux上发送邮件出现延迟问题,需要去配置一下,第三点会讲下
2.代码
cpuinfo() 读取linux下的/proc/stat文件,获取cpu信息。
cpuUsage() 获取两次cpuinfo的内容,比较两次的差别,得到cpu使用率。
memoryUsage() 读取linux下的/proc/meminfo文件,获取内存信息。
main() 主入口,当使用率过高,定时发送邮件提醒。
-
package LinuxMonitorUtils; -
import java.io.BufferedReader; -
import java.io.FileInputStream; -
import java.io.InputStreamReader; -
import java.util.ArrayList; -
import java.util.HashMap; -
import java.util.List; -
import java.util.Map; -
import java.util.StringTokenizer; -
import java.util.Timer; -
import java.util.TimerTask; -
import sendMailUtils.SendMail; -
public class OSUtils { -
/** -
* 功能:获取Linux系统cpu使用率 -
*/ -
public static float cpuUsage() { -
try { -
Map<?, ?> map1 = OSUtils.cpuinfo(); -
Thread.sleep(5 * 1000); -
Map<?, ?> map2 = OSUtils.cpuinfo(); -
long user1 = Long.parseLong(map1.get("user").toString()); -
long nice1 = Long.parseLong(map1.get("nice").toString()); -
long system1 = Long.parseLong(map1.get("system").toString()); -
long idle1 = Long.parseLong(map1.get("idle").toString()); -
long user2 = Long.parseLong(map2.get("user").toString()); -
long nice2 = Long.parseLong(map2.get("nice").toString()); -
long system2 = Long.parseLong(map2.get("system").toString()); -
long idle2 = Long.parseLong(map2.get("idle").toString()); -
long total1 = user1 + system1 + nice1; -
long total2 = user2 + system2 + nice2; -
float total = total2 - total1; -
long totalIdle1 = user1 + nice1 + system1 + idle1; -
long totalIdle2 = user2 + nice2 + system2 + idle2; -
float totalidle = totalIdle2 - totalIdle1; -
float cpusage = (total / totalidle) * 100; -
System.out.println("cpu使用率:"+ cpusage+"%"); -
return cpusage; -
} catch (InterruptedException e) { -
e.printStackTrace(); -
} -
return 0; -
} -
/** -
* 功能:CPU使用信息 -
*/ -
public static Map<?, ?> cpuinfo() { -
InputStreamReader inputs = null; -
BufferedReader buffer = null; -
Map<String, Object> map = new HashMap<String, Object>(); -
try { -
inputs = new InputStreamReader(new FileInputStream("/proc/stat")); -
buffer = new BufferedReader(inputs); -
String line = ""; -
while (true) { -
line = buffer.readLine(); -
if (line == null) { -
break; -
} -
if (line.startsWith("cpu")) { -
StringTokenizer tokenizer = new StringTokenizer(line); -
List<String> temp = new ArrayList<String>(); -
while (tokenizer.hasMoreElements()) { -
String value = tokenizer.nextToken(); -
temp.add(value); -
} -
map.put("user", temp.get(1)); -
map.put("nice", temp.get(2)); -
map.put("system", temp.get(3)); -
map.put("idle", temp.get(4)); -
map.put("iowait", temp.get(5)); -
map.put("irq", temp.get(6)); -
map.put("softirq", temp.get(7)); -
map.put("stealstolen", temp.get(8)); -
break; -
} -
} -
} catch (Exception e) { -
e.printStackTrace(); -
} finally { -
try { -
buffer.close(); -
inputs.close(); -
} catch (Exception e2) { -
e2.printStackTrace(); -
} -
} -
return map; -
} -
/** -
* 功能:内存使用率 -
*/ -
public static long memoryUsage() { -
Map<String, Object> map = new HashMap<String, Object>(); -
InputStreamReader inputs = null; -
BufferedReader buffer = null; -
try { -
inputs = new InputStreamReader(new FileInputStream("/proc/meminfo")); -
buffer = new BufferedReader(inputs); -
String line = ""; -
while (true) { -
line = buffer.readLine(); -
if (line == null) -
break; -
int beginIndex = 0; -
int endIndex = line.indexOf(":"); -
if (endIndex != -1) { -
String key = line.substring(beginIndex, endIndex); -
beginIndex = endIndex + 1; -
endIndex = line.length(); -
String memory = line.substring(beginIndex, endIndex); -
String value = memory.replace("kB", "").trim(); -
map.put(key, value); -
} -
} -
long memTotal = Long.parseLong(map.get("MemTotal").toString()); -
System.out.println("内存总量"+memTotal+"KB"); -
long memFree = Long.parseLong(map.get("MemFree").toString()); -
System.out.println("剩余内存"+memFree+"KB"); -
long memused = memTotal - memFree; -
System.out.println("已用内存"+memused+"KB"); -
long buffers = Long.parseLong(map.get("Buffers").toString()); -
long cached = Long.parseLong(map.get("Cached").toString()); -
double usage = (double) (memused - buffers - cached) / memTotal * 100; -
System.out.println("内存使用率"+usage+"%"); -
return memFree; -
} catch (Exception e) { -
e.printStackTrace(); -
} finally { -
try { -
buffer.close(); -
inputs.close(); -
} catch (Exception e2) { -
e2.printStackTrace(); -
} -
} -
return 0; -
} -
/** -
* 主入口 -
* @param args -
*/ -
public static void main(String[] args) { -
// //1. 创建计时器类 -
// Timer timer = new Timer(); -
// //2. 创建任务类 -
// TimerTask task = new TimerTask() { -
// @Override -
// public void run() { -
//cup使用率 -
float cpuUsage = cpuUsage(); -
if(cpuUsage > 10.0 ){ -
SendMail.sendMail("xxxxx@qq.com", "服务器cpu使用率过高,请注意查看", "服务器提醒"); -
} -
//内存使用情况 -
long memoryUsage = memoryUsage(); -
if((memoryUsage/1024) < 100){ -
SendMail.sendMail("xxxxx@qq.com","服务器内存剩余空间不足,请注意查看", "服务器提醒"); -
} -
System.out.println("-----------"); -
// } -
// }; -
// timer.schedule(task, 1000, 1000*10); -
} -
}
3.邮件发送过慢的问题
在测试代码的时候,我们发现了邮件发送过慢的问题,这在本机上并不在,所以我们还需要修改下linux的配置文件
在linux控制台输入, 查看本地端口的配置,因为sendmail监听的是127.0.0.1,但却无法确认主机名peixin,所以在我们的127.0.0.1 最后面配置主机名,例如我的是peixin,在最后配置peixin,之后重启下邮件发送。
# cat /etc/hosts
| 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 peixin ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 |
# service sendmail restart
本文介绍了在Linux系统中监控CPU和内存使用情况,并在使用率过高时发送邮件提醒的方法。包含整体架构图,给出了获取CPU和内存信息、计算使用率及主入口的代码,还针对邮件发送过慢问题,说明了修改Linux配置文件的解决办法。
642

被折叠的 条评论
为什么被折叠?



