精华内容
下载资源
问答
  • Java 服务器信息监控

    热门讨论 2012-10-09 15:27:18
    这是java做的服务器监控程序,支持多系统如window,Linux等主流系统,可监控物理内存,cpu,网络连接,服务等
  • java实现Linux服务器内存监控预警

    千次阅读 2017-12-29 11:15:20
    java程序 监控Linux内存监控 邮件预警

    1.需求场景

    利用java程序监控Linux服务器内存变化,根据设定的内存阈值发报警邮件

    2.项目环境

     普通java项目,jar形式

    3.解决方法

    (1)读取Linux 内存监控文件(/proc/meminfo)获取内存信息

    public  static  int [] getLinuxMemInfo() throws IOException, InterruptedException  
    	{  
    	File file = new File("/proc/meminfo" );  
    	BufferedReader br = new BufferedReader( new InputStreamReader(new FileInputStream(file)));  
    	int [] result = new  int [ 4 ];  
    	String str = null ;  
    	StringTokenizer token = null ;  
    	while ((str = br.readLine()) != null )  
    	{  
    	token = new StringTokenizer(str);  
    	if (!token.hasMoreTokens())  
    	continue ;  
    	str = token.nextToken();  
    	if (!token.hasMoreTokens())  
    	continue ;  
    	if (str.equalsIgnoreCase("MemTotal:" ))  
    	result[0 ] = Integer.parseInt(token.nextToken());  
    	else  if (str.equalsIgnoreCase("MemFree:" ))  
    	result[1 ] = Integer.parseInt(token.nextToken());  
    	else  if (str.equalsIgnoreCase("SwapTotal:" ))  
    	result[2 ] = Integer.parseInt(token.nextToken());  
    	else  if (str.equalsIgnoreCase("SwapFree:" ))  
    	result[3 ] = Integer.parseInt(token.nextToken());  
    	}
    	return result;
    	}

    (2)根据设定阈值,是否发邮件预警

        int [] mem = LinuxSystemTool.getMemInfo();
        double rate = (float)mem[1]/(float)mem[0];
    		String content ="比值:"+new java.text.DecimalFormat("#0.00").format(rate)+"\t总内存:"+mem[0]+"KB\t空闲物理内存:"+mem[1]+"KB\t交换分区总内存:"+mem[2]+"KB\t交换分区空闲内存:"+mem[3]+"KB";
    		if(rate<=0.2){
    		content+="\t系统有些累了!o(╥﹏╥)o";
    		EmailUtil.sendEmail("yourmail@163.com", "内存预警", content);
    		}else{
    			System.out.println("系统充满活力!^_^)";
    		}

     
    (3)shell脚本 
    

    #!/bin/sh
    export LANG=en_US.UTF-8
    cd  /test/demo
    /opt/jdk/bin/java -jar /test/demo/memmonitor.jar

    (4)设定定时任务

    crontab -e
    */10 * * * * /test/demo/memmonitor.sh
    



    展开全文
  • java服务器状态监控实现

    千次阅读 2010-12-05 01:36:36
    通过Hyperic-hq产品的基础包sigar.jar来实现服务器状态数据的获取。Sigar.jar包是通过本地方法来调用操作系统API来获取系统相关数据。Windows操作系统下Sigar.jar依赖sigar-amd64-winnt.dll或sigar-x86-winnt.dll,...
    <p>通过Hyperic-hq产品的基础包sigar.jar来实现服务器状态数据的获取。Sigar.jar包是通过本地方法来调用操作系统API来获取系统相关数据。Windows操作系统下Sigar.jar依赖sigar-amd64-winnt.dll或sigar-x86-winnt.dll,linux 操作系统下则依赖libsigar-amd64-linux.so或libsigar-x86-linux.so……而Sigar.jar还依赖于jug-asl-2.0.0.jar、log4j-1.2.14.jar、Junit.jar,<br />
    
    Hyperic-hq官方网站:http://www.hyperic.com<br />
    Sigar.jar下载地址:http://sigar.hyperic.com<br /></p>
    <pre name="code" class="java">package com.huawei.test;
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    import java.util.Properties;

    import org.hyperic.sigar.CpuInfo;
    import org.hyperic.sigar.CpuPerc;
    import org.hyperic.sigar.FileSystem;
    import org.hyperic.sigar.FileSystemUsage;
    import org.hyperic.sigar.OperatingSystem;
    import org.hyperic.sigar.Sigar;
    import org.hyperic.sigar.SigarException;

    public class Test {
    public static void main(String[] args) throws SigarException,
    UnknownHostException
    {
    OperatingSystem OS = OperatingSystem.getInstance();

    System.out.println("=========操作系统========");
    // 操作系统内核类型如: 386、486、586等x86
    System.out.println("操作系统内核 = " + OS.getArch());
    System.out.println("OS.getCpuEndian() = " + OS.getCpuEndian());//
    System.out.println("OS.getDataModel() = " + OS.getDataModel());//
    // 系统描述
    System.out.println("系统描述 = " + OS.getDescription());

    // 操作系统类型
    System.out.println("系统类型 = " + OS.getName());
    // 操作系统的卖主
    System.out.println("系统卖主 = " + OS.getVendor());
    // 卖主名称
    System.out.println("卖主名称 = " + OS.getVendorCodeName());
    // 操作系统名称
    System.out.println("系统名称 = " + OS.getVendorName());
    // 操作系统卖主类型
    System.out.println("系统类型 = " + OS.getVendorVersion());
    // 操作系统的版本号
    System.out.println("版本号 = " + OS.getVersion());

    System.out.println("==============cpu===================");
    Sigar sigar = new Sigar();
    CpuInfo infos[] = sigar.getCpuInfoList();
    CpuPerc cpu = sigar.getCpuPerc();
    String address = InetAddress.getLocalHost().getHostAddress();
    System.out.println("本机IP地址" + address);
    for (int i = 0; i < infos.length; i++)
    {
    CpuInfo info = infos[i];
    //CPU的总量MHz
    System.out.println("CPU总量mhz=" + info.getMhz());
    //获得CPU的卖主,如:Intel
    System.out.println("vendor=" + info.getVendor());
    //获得CPU的类别,如:Celeron
    System.out.println("model=" + info.getModel());
    //缓冲存储器数量
    System.out.println("cache size=" + info.getCacheSize());
    // 用户使用率
    System.out.println("User :" + CpuPerc.format(cpu.getUser()));
    // 系统使用率
    System.out.println("Sys :" + CpuPerc.format(cpu.getSys()));
    }
    FileSystem fslist[] = sigar.getFileSystemList();
    System.out.println("长度为什么是:"+fslist.length);

    for (int i = 0; i < fslist.length - 2; i++)
    {
    System.out.println("============硬盘描述============");
    System.out.println("\n~~~~~~~~~~" + i + "~~~~~~~~~~");
    FileSystem fs = fslist[i];
    // 分区的盘符名称
    System.out.println("fs.getDevName() = " + fs.getDevName());
    // 分区的盘符名称
    //System.out.println("fs.getDirName() = " + fs.getDirName());

    // 文件系统类型,比如 FAT32、NTFS
    System.out.println("fs.getSysTypeName() = " + fs.getSysTypeName());
    // 文件系统类型名,比如本地硬盘、光驱、网络文件系统等
    System.out.println("fs.getTypeName() = " + fs.getTypeName());
    // 文件系统类型

    FileSystemUsage usage = sigar.getFileSystemUsage(fs.getDirName());
    String sub = fs.getDevName().substring(0, 1);
    // 文件系统总大小
    System.out.println(" 硬盘 " + sub + "=" + usage.getTotal() / 1024
    / 1024 + "GB");

    // 文件系统剩余大小
    System.out.println(" 硬盘剩余大小= " + usage.getFree() / 1024 / 1024
    + "GB");
    // 文件系统可用大小
    System.out.println(" 硬盘可用大小 = " + usage.getAvail() / 1024 / 1024
    + "GB");
    // 文件系统已经使用量
    System.out.println(" 经使用量 = " + usage.getUsed() / 1024 / 1024
    + "GB");
    double usePercent = usage.getUsePercent() * 100D;
    // 文件系统资源的利用率
    System.out.println(" 利用率 = " + usePercent + "%");

    System.out.println(" DiskReads = " + usage.getDiskReads());
    System.out.println(" DiskWrites = " + usage.getDiskWrites());
    }

    if (java.awt.Desktop.isDesktopSupported())
    {
    try
    {
    //创建一个URI实例
    java.net.URI uri = java.net.URI.create("http://cn.bing.com/");
    //获取当前系统桌面扩展
    java.awt.Desktop dp = java.awt.Desktop.getDesktop();
    //获得系统属性集
    Properties props = System.getProperties();
    //操作系统名称
    String osName = props.getProperty("os.name");
    System.out.println("操作系统名称:" + osName);
    //操作系统构架
    String osArch = props.getProperty("os.arch");
    System.out.println("系统架构:" + osArch);
    //操作系统版本
    String osVersion = props.getProperty("os.version");
    System.out.println("操作系统版本:" + osVersion);
    //Java安装目录
    String home = props.getProperty("java.home");
    System.out.println("java安装目录:" + home);
    //用户的账户名称
    String user = props.getProperty("user.home");
    System.out.println("用户帐户名称:" + user);
    //Java 运行时环境规范名称
    String version = props.getProperty("java.specification.name");
    System.out.println("Java 运行时环境规范名称 :" + version);
    //获取当前jdk的版本号
    String number = props.getProperty("java.specification.version");
    System.out.println("jdk的版本号:" + number);

    //判断系统桌面是否支持要执行的功能
    if (dp.isSupported(java.awt.Desktop.Action.BROWSE))
    {
    //获取系统默认浏览器打开链接
    dp.browse(uri);


    }
    }
    catch (java.lang.NullPointerException e)
    {
    //此为uri为空时抛出异常
    }
    catch (java.io.IOException e)
    {
    //此为无法获取系统默认浏览器
    }

    }
    }
    }

    [img]http://dl.iteye.com/upload/attachment/361034/5665ba65-001f-349a-bb92-20055dad08bd.png[/img]
    展开全文
  • Sigar Java实现系统监控

    2014-11-07 15:19:00
    使用Sigar实现系统服务器端的监控,里面包括实现的代码以及用到的sigar所有的包和库
  • 今天小编就为大家分享一篇关于Java实现实时监控目录下文件变化的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • java实现自定义Weblogic监控java实现自定义Weblogic监控java实现自定义Weblogic监控
  • java实现简单远程监控

    2012-08-04 20:46:01
    java实现远程监控
  • 正在研究java实现远程监控linux服务器内存,cup,硬盘等信息,或者在远程服务器中部署采集程序,采集内存,CPU,硬盘信。搜集了一些思路正在整理测试中,有经验的朋友可以留言分享经验。 第一种方法 采用java实现...

    正在研究java实现远程监控linux服务器内存,cup,硬盘等信息,或者在远程服务器中部署采集程序,采集内存,CPU,硬盘信。搜集了一些思路正在整理测试中,有经验的朋友可以留言分享经验。

    第一种方法

    采用java实现远程监控linux服务器内存,cup,硬盘等信息。

    1)此法,采用执行shell脚本获取,服务器中内存,cpu,硬盘等。

    2)定期更新中.....

     

     

    第二种方法,

    在远程服务器中部署采集程序,定时采集内存,CPU,硬盘等信息。此法缺点,需要在每台服务器中进行部署,维护难度增大。

    1)此法需要先通过采集程序,定时采集服务器中的内存,cpu,硬件等信息,然后,写入数据中,以便进行监控操作。

    2)更新中....

     

    展开全文
  • Java服务器性能监控(一) Metrics

    万次阅读 2017-07-30 18:59:34
    这篇文章主要介绍了Java服务器性能监控中常用的基本变量——Metrics。

    引言

    对于后台服务而言,我们除了需要保证其每个功能正常工作,我们还需要了解服务的运行情况,包括机器的物理性能(线程数,文件句柄数,内存占用大小,GC时间等)以及业务性能(关键流程的通过率、QPS以及响应时间等)。目前,常用的做法是通过定义、收集以及展示一系列的指标(metrics)来完成后台服务的监控。

    监控其实可以分为四部分,首先我们需要定义监控数据的产生,然后我们需要定义监控数据收集的规则,再后则是数据监控数据的展现形式,最后则是根据监控数据进行报警。本文会从监控数据的产生写起,逐步为大家介绍,如何在Java服务中接入监控服务。本文主要基于目前较为流行的metrics框架,codahale的metrics,其maven依赖如下所示:

    <dependencies>
        <dependency>
            <groupId>com.codahale.metrics</groupId>
            <artifactId>metrics-core</artifactId>
            <version>3.1.2</version>
        </dependency>
    </dependencies>

    Metrics中的基础数据类型

    说到监控数据如何产生,就必须先从其基础的数据类型说起。下面介绍三种最常用的数据类型,Counter, Gauge, 以及Histogram。一般的Java Metrics库都会有这三者的实现。

    Counter(计数器)

    跟字面意思一样,Counter就是一个只增不减的计数器,主要就是用于统计总量,它的常用用法如下所示:

    • 统计Api访问中异常(400/500)的次数

    • 统计Api的调用量

    • 统计特定事件发生的次数。

    那么,Counter的底层又是如何实现的呢?尤其是在高并发的访问情况下面,如何保证Counter的自增原子性以及发生竞争时保证性能?

    在codahale的源码里面,设置了如下的机制来确保Counter自增的原子性以及高性能。

    • 使用base与cells机制

    在源码中,每个Counter都会由两部分组成,简化代码如下

    public class Counter {
    
        transient volatile int busy;
    
        transient volatile long base;
    
        transient volatile Cell[] cells;
    
        public void inc(long n) {
    
            long b;
    
            if(cells == null || !casBase(b=base, b+n)) {
                //使用cells进行计算
            } 
        }
    
        public long sum() {
            long sum = base;
            Cell[] as = cells;
            if (as != null) {
                int n = as.length;
                for (int i = 0; i < n; ++i) {
                    Cell a = as[i];
                    if (a != null)
                        sum += a.value;
                }
            }
            return sum;
        }
    }
    

    而大致的执行流程图,则如下图所示:

    Counter原子性操作高性能流程图
    最后总结一下,Counter有以下几个特点:

    1. 使用base与cells进行数值存储,无竞争的时候,实际上只更新了base的值。而在有竞争的情况下,则通过cells来分散竞争,保证了Counter的高性能。

    2. Counter在有竞争的情况下,使用的是自旋锁,实际上是通过消耗极小的CPU时间来节省了线程之间上下文切换的消耗

    3. 为了保证不过量使用内存,当cells的数量超过CPU的个数时,cells就不会再进行扩容

    Gauge (度量器)

    Gauge同样也是一个数字类型的指标,跟Counter不一样,它主要用于收集指标的瞬时值,因此它是可变的。它的常用用法如下所示:

    • 统计Api的响应时间(响应时间并非固定值,可能时高时低,这个时候就应该用Gauge进行记录)

    • 统计CPU的负载

    • 统计CPU核心线程数、运行线程数

    • 统计操作系统的文件句柄数

    相对于Counter来说,因为Gauge记录的只是一个瞬时值,因此也不用考虑多线程下的竞争与冲突问题。它的Java结构如下(简化)

        private final static class SimpleGauge {
    
            private volatile double value;
    
            private SimpleGauge(double value) {
                this.value = value;
            }
    
            public Double getValue() {
                return this.value;
            }
    
            public void setValue(double value) {
                this.value = value;
            }
    
        }

    Histogram(直方图)

    当我们不仅仅关注计数,或者是瞬时变量,而是需要知道最大值,最小值,中位数,平均值以及第99%的值时,我们就需要用到直方图这个统计类型了。Histogram主要的用途是表示分布情况。

    考虑一个情况,你需要统计一个api的访问时间第99%的响应时间。一个简单的想法就是,将所有的响应时间记录下来,然后排序,再取出第99%个值就可以了。但是这个api的又是一直在被调用着的,因此会不断地有新的响应时间被记录,因此这样做是永远无法得到第99%的访问时间的。

    为了解决这个问题,codehale中的histogram使用了Reservoir类来对响应时间这一类的数据进行收集。Reservoir,中文可以翻译为“蓄水池”,实际上它就是一个保存数据的池子,然后在我们需要统计的时候,取出Snapshot(快照)供我们获得统计数据。

    了解了基本原理之后,我们来看一下histogram的源码。

    public class Histogram implements Metric, Sampling, Counting {
        private final Reservoir reservoir;
        private final LongAdder count;
    
        public Histogram(Reservoir reservoir) {
            this.reservoir = reservoir;
            this.count = new LongAdder();
        }
    
        //向histogram中增加新的数据,实际上就是向数据池中添加数据
        public void update(int value) {
            update((long) value);
        }
    
        public void update(long value) {
            count.increment();
            reservoir.update(value);
        }
    
        @Override
        public long getCount() {
            return count.sum();
        }
    
        //获取Snapshot,实际上也是通过数据池来获取
        @Override
        public Snapshot getSnapshot() {
            return reservoir.getSnapshot();
        }
    }

    再来看看Snapshot的代码。

    public class Snapshot {
    
        //最核心的方法,用于获取第n%的值
        public double getValue(double quantile);
    
        private final long[] values;
    
    
        public double getMedian() {
            return getValue(0.5);
        }
    
        public double get75thPercentile() {
            return getValue(0.75);
        }
    
        /*
            省略部分getNthPercentile函数
        */
    
        public long getMax();
    
        public double getMean();
    
        public long getMin();
    
        /*
        ...
        */ 
    }
    

    所以,从Snapshot中,我们就基本能够得到我们想要的统计数据了。

    然后,我们来简单地了解一下数据池。定义了数据池以后,我们就需要考虑更多的问题了,比如说,如何保证可以高性能地将数据写入数据池中,以及如何保证数据池中数据量不会过大而占用过多的内存,以及如何快速地取出快照。在Codahale metrics里面,主要定义了三种数据池。

    • UniformReservoir 默认保存1028条记录,每次进行update操作的时候,首先会依次地将值填入1028条记录中,当记录满了之后,就会使用随机替换0 - 1027中的一条。因为是随机替换,所以也不需要进行加锁和解锁。

    • SlidingWindowReservoir 固定大小的数据池,从0到n-1填入数据,不断循环。也不会进行加锁和解锁。

    • SlidingTimeWindowReservoir 非固定大小的数据池,但是只会存储过去N秒的数据。使用ConcurrentSkipListMap进行存储。

    • ExponentiallyDecayingReservoir 固定大小的数据池。首先会逐个数据填满数据池,随后会将老的数据替换为新的数据,使用ConcurrentSkipListMap进行存储。可以说是SlidingWindowReservoir与SlidingTimeWindowReservoir的结合。

    使用Registry对Metrics进行收集,输出

    当我们在系统里面定义了多个Metrics的时候,如何准确高效地收集它们,并且将这些数据输出到分析系统中,就会成为我们要思考的问题。

    Codahale使用了Registry的注册机制对Metrics进行收集(这也是大部分Metrics框架的做法),另外,它还使用了Reporter作为输出。

    下面是一个简单的示例。

    public class TestMain {
        public static void main(String args[]) {
    
            MetricRegistry registry = new MetricRegistry();
    
            //声明Gauge
            TestGauge<Integer> responseTime = new TestGauge<Integer>();
    
            responseTime.setValue(20);
    
            //将Gauge注册到registry中。
            registry.register("testGauge", responseTime);
    
            //使用ConsoleReporter,将metrics的值输出到System.out中
            ConsoleReporter reporter = ConsoleReporter.forRegistry(registry)
                             .build();
    
            //每隔一秒输出一次
            reporter.start(1, TimeUnit.SECONDS);
    
            //等待5秒再结束程序
            Thread.sleep(5000);
        }
    
        //自定义的Gauge
        public static class TestGauge<T> implements Gauge {
    
            private T value;
    
            public void setValue(T v) {
                this.value = v;
            }
    
            @Override
            public T getValue() {
                return value;
            }
        }
    }

    输出结果如下所示:

    17-7-27 23:36:57 ================================================================

    – Gauges ———————————————————————-
    testGauge
    value = 20

    在Spring项目中,MetricRegistry常常会被声明成一个Bean,然后在有需要的地方进行注入,最后就可以达到只通过一个MetricRegistry,就能够收集到所有指标的效果。

    在这样声明完成后,我们就可以通过registry.getCounters/getHistograms/getGauges来获取我们所有注册过的metrics类型了。其实这里更重要的是MetricsRegistry,因为里面包含了所有Metrics的获取方法,至于获取方法之后如何进行输出,我们可以自行定义,也可以使用codahale中既有的Reporter。

    小结

    在这一篇文章中,我们主要介绍了在Java应用中是如何做一些性能指标的收集的。包括对Gauge,Counter,Histogram三种基础数据类型的介绍,以及收集机制的介绍。

    在实现Metrics收集机制的时候,我们不得不去考虑几个问题。

    1. 我们需要收集的是瞬时值,计数,还是统计分布值?

    2. 在进行数据记录的时候,如何保证高性能地写入/更新?(尽可能少地使用锁)如何保证数据合理地被更新?

    3. 如何将metrics数据汇总到一个地方以便于后期处理?

    示例代码也已经上传到github中。欢迎关注。

    展开全文
  • import java.io.BufferedReader; import java.io.DataInputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import jav...
  • java使用sigar监控服务器

    千次阅读 2020-07-29 10:08:00
    import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Map; import java.util.Properties; import org.hyperic.sigar.Cpu; import org.hyperic.sigar.CpuInfo; import org.hyperic...
  • java web服务器性能监控工具JavaMelody

    千次阅读 2013-11-20 14:23:35
    下载Jar包javamelody-1.47.0.jar和jrobin-1.5.9.jar http://code.google.com/p/javamelody/downloads/list ...
  • 服务器java性能监控

    万次阅读 2018-12-08 11:40:28
    环境: springboot 2.0.6.RELEASE centos 7.2 ...实现对cpu、内存、磁盘以及java项目jvm、请求等一系列监控java项目配置: pom.xml: &lt;!-- 监控 --&gt; &lt;!-- https://...
  • import java.net.InetAddress; import java.net.UnknownHostException; import org.hyperic.sigar.CpuInfo; import org.hyperic.sigar.CpuPerc; import org.hyperic.sigar.FileSystem; import ...
  • 基于JAVA网络远程监控系统软件的实现(源码)。基于JAVA网络远程监控系统软件的实现(源码)。基于JAVA网络远程监控系统软件的实现(源码)。
  • Java Web 服务器性能监控工具 JavaMelody

    千次阅读 2016-01-08 20:22:52
    1、maven 依赖 <groupId>net.bull.javamelody</groupId> <artifactId>javamelody-core <version>1.58.0 <groupId>org.jrobin</groupId>
  • java利用sigar监控服务器cpu、内存等性能值

    千次阅读 热门讨论 2019-05-16 10:01:16
    今天来了个需求,需要实时监控服务器cpu跟内存参数的占用百分比。 还没开始前首要想到的是用java执行linux命令:cat /proc/meminfo 这里面内存具体信息啥都有,查看cpu的话最常用的就是top+p。 想了一通下来,...
  • 使用Java实现简单的监控系统

    千次阅读 2020-05-05 15:15:36
    本文只是简单介绍了下监控系统实现的思路,具体还需根据自己需求实现。 前言: 目前存在一个后台服务系统,此时需要配套一个监控系统,对这个后台服务系统进行监控。下面会涉及到两个系统,后台服务系统(这是已经...
  • Java Robot对象实现服务器屏幕远程监视
  • Java实现局域网流量监控

    千次阅读 2016-09-15 11:36:27
    局域网流量监控
  • 主要介绍了java实现socket从服务器连续获取消息的示例,需要的朋友可以参考下
  • Java实现FTP服务器解决方案.doc
  • NULL 博文链接:https://xjg396.iteye.com/blog/1559978
  • SpringBoot 集成 JavaMelody实现 性能监控

    千次阅读 2018-12-16 19:53:17
    JavaMelody能够在运行环境监测JavaJava EE应用程序服务器。并以图表的形式显示:Java内存和Java CPU使用情况,用户Session数量,JDBC连接数,和http请求、sql请求、jsp页面与业务接口方法(EJB3、spring、Guice)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 193,593
精华内容 77,437
关键字:

java实现服务器监控

java 订阅