公司要求实时监控服务器,写个Web的监控系统

转自:http://kakaluyi.iteye.com/blog/228636

公司的服务器需要实时监控,而且当用户空间已经满了,操作失败,或者出现程序Exception的时候就需要实时提醒,便于网管和程序员调式,这样就把这个实时监控系统分为了两部分,

 

第一部分:实时系统监控(cpu利用率,cpu温度,总内存大小,已使用内存大小)

第二部分:实时告警

由于无刷新实时性,所以只能使用Ajax,这里没有用到任何ajax框架,因为调用比较简单

大家知道,由于java的先天不足,对底层系统的调用和操作一般用jni来完成,特别是cpu温度,你在window下是打死用命令行是得不到的, 但由于我们的服务器系统是linux,所以可以不调用jni完全用java的方式来得到系统信息,这里用到了runtime的exec()函数,通过解析 本地命令调用的结果来查询本地信息,

这里要感谢公司同事qinkun推荐ecsun兄的这篇文章http://papa.iteye.com/blog/220532 ,

 

Java代码   收藏代码
  1. * 取得linux系统下的cpu、内存信息   
  2. *   
  3. * */   
  4. public   final   class  LinuxSystemTool   
  5. {   
  6. /**   
  7. * get memory by used info   
  8. *   
  9. * @return int[] result   
  10. * result.length==4;int[0]=MemTotal;int[1]=MemFree;int[2]=SwapTotal;int[3]=SwapFree;   
  11. * @throws IOException   
  12. * @throws InterruptedException   
  13. */    
  14. public   static   int [] getMemInfo()  throws  IOException, InterruptedException   
  15. {   
  16. File file = new  File( "/proc/meminfo" );   
  17. BufferedReader br = new  BufferedReader( new  InputStreamReader(   
  18. new  FileInputStream(file)));   
  19. int [] result =  new   int [ 4 ];   
  20. String str = null ;   
  21. StringTokenizer token = null ;   
  22. while ((str = br.readLine()) !=  null )   
  23. {   
  24. token = new  StringTokenizer(str);   
  25. if (!token.hasMoreTokens())   
  26. continue ;   
  27.   
  28. str = token.nextToken();   
  29. if (!token.hasMoreTokens())   
  30. continue ;   
  31.   
  32. if (str.equalsIgnoreCase( "MemTotal:" ))   
  33. result[0 ] = Integer.parseInt(token.nextToken());   
  34. else   if (str.equalsIgnoreCase( "MemFree:" ))   
  35. result[1 ] = Integer.parseInt(token.nextToken());   
  36. else   if (str.equalsIgnoreCase( "SwapTotal:" ))   
  37. result[2 ] = Integer.parseInt(token.nextToken());   
  38. else   if (str.equalsIgnoreCase( "SwapFree:" ))   
  39. result[3 ] = Integer.parseInt(token.nextToken());   
  40. }   
  41.   
  42. return  result;   
  43. }   
  44.   
  45. /**   
  46. * get memory by used info   
  47. *   
  48. * @return float efficiency   
  49. * @throws IOException   
  50. * @throws InterruptedException   
  51. */    
  52. public   static   float  getCpuInfo()  throws  IOException, InterruptedException   
  53. {   
  54. File file = new  File( "/proc/stat" );   
  55. BufferedReader br = new  BufferedReader( new  InputStreamReader(   
  56. new  FileInputStream(file)));   
  57. StringTokenizer token = new  StringTokenizer(br.readLine());   
  58. token.nextToken();   
  59. int  user1 = Integer.parseInt(token.nextToken());   
  60. int  nice1 = Integer.parseInt(token.nextToken());   
  61. int  sys1 = Integer.parseInt(token.nextToken());   
  62. int  idle1 = Integer.parseInt(token.nextToken());   
  63.   
  64. Thread.sleep(1000 );   
  65.   
  66. br = new  BufferedReader(   
  67. new  InputStreamReader( new  FileInputStream(file)));   
  68. token = new  StringTokenizer(br.readLine());   
  69. token.nextToken();   
  70. int  user2 = Integer.parseInt(token.nextToken());   
  71. int  nice2 = Integer.parseInt(token.nextToken());   
  72. int  sys2 = Integer.parseInt(token.nextToken());   
  73. int  idle2 = Integer.parseInt(token.nextToken());   
  74.   
  75. return  ( float )((user2 + sys2 + nice2) - (user1 + sys1 + nice1)) / ( float )((user2 + nice2 + sys2 + idle2) - (user1 + nice1 + sys1 + idle1));   
  76. }   
  77. }   

 

这里的两个方法,解释一下,

方法1文件"/proc/meminfo"里面包含的就是内存的信息,还包括了swap的信息。例如:

$ cat /proc/meminfo

total: used: free: shared: buffers: cached:
Mem: 1057009664 851668992 205340672 0 67616768 367820800
Swap: 2146787328 164429824 1982357504
MemTotal: 1032236 kB
MemFree: 200528 kB
MemShared: 0 kB
这样可以用截取字符串的方法,来得到linux内存信息.

方法2在文件"/proc/stat"里面就包含了CPU的信息。每一个CPU的每一tick用在什么地方都在这个文件里面记着。后面的数字含义分 别是: user、nice、sys、idle、iowait。有些版本的kernel没有iowait这一项。这些数值表示从开机到现在,CPU的每tick用 在了哪里。例如:

cpu0 256279030 0 11832528 1637168262

就是cpu0从开机到现在有 256279030 tick用在了user消耗,11832528用在了sys消耗。所以如果想计算单位时间(例如1s)里面CPU的负载,那只需要计算1秒前后数值的差除以每一秒的tick数量就可以了。

ok这样还剩下cpu温度,怎么做呢

发现了一个文件"cat /proc/acpi/thermal_zone/THM/temperature";可以返回本机的linux温度,

大概是这样的:temperature:            68C

但不是每台linux机器都有这个THM你要确定你的linux加载了这个THM才能使用这个文件,这样就用InputStreamReader(new FileInputStream(new File("/proc/acpi/thermal_zone/THM/temperature")), 去读取这个文件,后面的相信大家一定会做了吧,就是把内容读出来,然后分割字符串去得到这个68。ok,系统基本信息全部完成,然后ok现在就只有一件事就是用Ajax去调用这个类来得到 基本信息,然后返回到页面上,Ajax的用法就不赘言了。

 

下面是系统监控的效果,大概是Ajax每几秒去linux下去取一次系统信息,然后显示在jsp页面上,以下是效果。

 

 

 

 

到这里第一部分系统监控部分已经完成,现在开始完成实时告警部分,分析需求

1温度和cpu超过额定值需要告警

2用户操作系统失败,用户存储空间不足也需要告警,还有我们公司的业务操作失败告警,如果发生Exception也只能告警,当然要把异常的堆栈的 信息保存在数据库里,我就这样设计如果用户在操作中触发了这些错误,则保存在数据库的告警表里,然后实时监控的再取出来这些信息。

3告警是要实时的那么要怎么从告警表里查到当前以后的数据呢,一开始想到用当前时间,在当前时间加上Ajax发送时间间隔,select * from warnlist where date>new Date()+AjaxTime这种形式,后来发现时间是很不正确的,网络延迟,程序处理时间,(cpu信息用了sleep函数),等等你常常会发现有些 告警信息被无情的放过,而有的时候有重复数据,这样我想到了用id,每次进入告警系统先查询到最大的告警id,然后保存在session中,然后ajax 从数据库里取告警信息的时候都查这个id之后的数据(就是进入监控系统后的最新数据),然后session再保存新的最大id,下次ajax取还是从这个 session中取最大id,这样信息就可以当ajax取的时候都保证是最新的,而且没有重复,very good!就这样做了

这样设计了一张告警处理表

Sql代码   收藏代码
  1. CREATE   TABLE  `warnlist` (  
  2.   `Id` bigint (20)  NOT   NULL  auto_increment,  
  3.   `warnleave` tinyint(2) NOT   NULL   default   '0' ,//告警级别:告警的严重程度  
  4.   `fromguy` varchar (20)  NOT   NULL ,//属于哪个用户哪个组织的告警  
  5.   `warncontent` varchar (100)  NOT   NULL ,//告警内容,比如cpu使用率超过80%  
  6.   `aviliablevalue` varchar (12)  default   NULL ,//允许值 比如85%  
  7.   `warnvalue` varchar (12)  default   NULL ,//告警值 80  
  8.   `warntime` datetime NOT   NULL ,//告警时间  
  9.   `stackinfo` varchar (255)  default   NULL ,//异常的堆栈信息  
  10.   `dealwith` tinyint(2) NOT   NULL   default   '0' ,//处理结果  
  11.   `version` int (11)  default   NULL ,//version  
  12.   `organizerID` varchar (20)  default   NULL ,//组织id  
  13.   `des` varchar (255)  default   NULL ,  
  14.   PRIMARY   KEY   (`Id`)  
  15. ) ENGINE=InnoDB DEFAULT  CHARSET=utf8;  

 

假设我ajax从系统取信息后,那么要写个逻辑,if(cpuTempature>75C)or if(cpuUserd>80%)则写入数据库,然后再查询大于上一次发送Ajax数据库的最大id的告警信息(这期间如果发生的以下错误一并查 出:用户存储空间不足,还有我们公司的业务操作失败告警,Exception等),循环插入一个xml解析类中,大概形式是这样的Ajax返回这个 xml,供页面提取信息

Xml代码   收藏代码
  1. < response >   
  2. < cpuUsed > 67 </ cpuUsed >   
  3. < cpuTemp > 76 < cpuTemp >   
  4. < Memory > 1023422 </ Memory >   
  5. < freeMemory > 43244 </ freeMemory >   
  6. < wannlist >   
  7. < warnid > 2 </ warnid >   
  8. < warncontent > 系统存储空间不足 </ warncontent >   
  9. < fromguy > kakaluyi </ fromguy >   
  10. ..............  
  11. </ wanrlist >   
  12. < warnlist >   
  13. < warnid > 3 </ warnid >   
  14. < warncontent > cpu温度过高 </ warncontent >   
  15. < fromguy > 系统 </ fromguy >   
  16. < orgid > 系统 </ orgid >   
  17. < warnvalue > 78 </ warnvalue >   
  18. .............  
  19. </ warnlist >   
  20. ........  
  21.   
  22. </ response >   

 

系统信息的显示代码,就是关联上面那个图片的:

Html代码   收藏代码
  1. var  cpuUsed = req .responseXML.getElementsByTagName('cpuUsed')[0].firstChild.nodeValue;  
  2. var totalMemory = req .responseXML.getElementsByTagName('totalMemory')[0].firstChild.nodeValue;  
  3. var freeMemory = req .responseXML.getElementsByTagName('freeMemory')[0].firstChild.nodeValue;  
  4. var cpuTemp = req .responseXML.getElementsByTagName('cpuTemp')[0].firstChild.nodeValue;  
  5. $('cpuUsed').innerHTML = cpuUsed ;  
  6. $('totalMemory').innerHTML = totalMemory ;  
  7. $('freeMemory').innerHTML = freeMemory ;  
  8. $('cpuTemp').innerHTML = cpuTemp ;  
  9.   
  10. //jsp  
  11. < tr >   
  12. < td   class = "label"   width = "20%" >   
  13. 服务器CPU使用率:</ td >   
  14. < td   class = "text" >   
  15. < font   color = "#FF0000"   size = "+2" > < label   id = "cpuUsed" > </ label >   
  16. </ font >   <  告警预定阀值: 80%  >   
  17. </ td >   
  18. </ tr >   
  19.  .........  

然后就是页面展现的问题了这里我用了dom节点的增删,一个页面保持50条记录,如果超过50条则删除以前的节点,代码为:

 

 

Js代码   收藏代码
  1. var  length=req.responseXML.getElementsByTagName( 'warnlist' ).length;  
  2. if (length>0)  
  3. {  
  4. var  trlength=document.getElementsByTagName( 'table' )[4].childNodes[0].childNodes.length;  
  5.   
  6. if (trlength+length-1>50) //如果大于50条,则查找告警列表的table,得到   
  7. 告警信息的子节点,然后删除多余的最早的告警信息  
  8. {  
  9. var  tbody=document.getElementsByTagName( 'table' )[4].childNodes[0];  
  10. for ( var  i=1;i<trlength+length-50;i++)  
  11. {  
  12. var  tr=tbody.childNodes[i];  
  13. tr.parentNode.removeChild(tr);  
  14.   
  15. }  

 

然后插入新的告警信息,

Js代码   收藏代码
  1. for ( var  i=0;i<length;i++)  
  2. {  
  3. var  onewarnlist=req.responseXML.getElementsByTagName( 'warnlist' )[i].childNodes;  
  4. if (onewarnlist[0].firstChild.nodeValue==0)  
  5. {  
  6. var  leave= "企业级告警" ;  
  7. }  
  8. else  {  
  9. var  leave= "运营商级告警" ;  
  10. }  
  11. var  from=onewarnlist[1].firstChild.nodeValue;  
  12. var  warncontent=onewarnlist[2].firstChild.nodeValue;  
  13. var  aviliablevalue=onewarnlist[3].firstChild.nodeValue;  
  14. var  warnvalue=onewarnlist[4].firstChild.nodeValue;  
  15. var  warntime=onewarnlist[5].firstChild.nodeValue;  
  16. var  id=onewarnlist[8].firstChild.nodeValue;  
  17. if (onewarnlist[6].firstChild.nodeValue==0)  
  18. {  
  19. var  dealwith= "未处理"  ;  
  20. }  
  21. else  {  
  22. var  dealwith= "<font color='red'>已处理</font>" ;  
  23. }  
  24. var  table=document.getElementById( 'warntable' );  
  25. var  tr=document.createElement( 'tr' );  
  26.  if (x%2==1)  
  27. {  
  28. tr.style.backgroundColor="#BFD3F9"   
  29. }  
  30. else {  
  31. tr.style.backgroundColor="#FBFCEB"   
  32. }  
  33. x++;  
  34. table.appendChild(tr);  
  35. var  td=document.createElement( 'td' );  
  36. td.className ='listText' ;  
  37. td.innerHTML =x;  
  38. tr.appendChild(td);  
  39. var  td1=document.createElement( 'td' );  
  40. td1.className ='listText' ;  
  41. td1.innerHTML = leave;  
  42. tr.appendChild(td1);  
  43. var  td2=document.createElement( 'td' );  
  44. td2.className ='listText' ;  
  45. td2.innerHTML = from;  
  46. tr.appendChild(td2);  
  47. var  td3=document.createElement( 'td' );  
  48. td3.className ='listText' ;  
  49. td3.innerHTML = warncontent;  
  50. tr.appendChild(td3);6  
  51. var  td4=document.createElement( 'td' );  
  52. td4.className ='listText' ;  
  53. td4.innerHTML = aviliablevalue;  
  54. tr.appendChild(td4);  
  55. var  td5=document.createElement( 'td' );  
  56. td5.className ='listText' ;  
  57. td5.innerHTML = '<font color="#FF0000">' +warnvalue+ '</font>' ;  
  58. tr.appendChild(td5);  
  59. var  td6=document.createElement( 'td' );  
  60. td6.className ='listText' ;  
  61. td6.innerHTML = warntime;  
  62. tr.appendChild(td6);  
  63. var  td7=document.createElement( 'td' );  
  64. td7.className ='listText' ;  
  65. td7.innerHTML = dealwith;  
  66. tr.appendChild(td7);  
  67. var  td8=document.createElement( 'td' );  
  68. td8.className ='listText' ;  
  69. td8.innerHTML = id;  
  70. tr.appendChild(td8);  
  71.    }  

 

ok,一切大功告成,以下是最终效果

监控系统——Zabbix Zabbix是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。Zabbix 能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。zabbix 由 2 部分构成,Zabbix server 与可选组件 Zabbix agent。通过C/S 模式采集数据,通过B/S 模式在 Web 端展示和配置。可以通过Zabbix agent,SNMP协议,端口监视等方法提供。 阅读详情

相关推荐

对监控系统的认识与思考

1、监控是什么 实现系统从存活性到性能及关键业务数据波动异常的全景监控 2、为什么要做监控 3、监控系统的架构 4、监控系统为什么要分级 5、应用监控 6、要解决的问题

lancerFm的博客 2289

Python搭建一个系统信息实时监控数据可视化大屏

本文分享使用python搭建服务器应用的监控系统面板,主要流程如下: 1、数据库中创建数据表 2、建立数据库连接 实时数据插入数据表,实时查询更新面板数据准备 3、监控中心大屏制作 具体步骤: 1、创建监测指标数据表字段 这里为了方便将系统信息监控的CPU信息、内存信息、磁盘信息放在一张表中。 实际上可以将CPU和磁盘信息监控指标分表设置,两者对时间粒度要求是不一样的,减少不需要的资源消耗。后期专门写一篇来聊聊如何搭建数据指标体系。 import pymysql db = pymysql.connect(u

AI悦创·编程私教1v1 2253

动环监控系统基础功能

  为了保证机房有序运行,配备运维工作是必要的,公司企业通常配备机房动环监控系统,为机房内服务器等硬件等设备,监测故障,排除安全隐患,避免损失,保证整个单位24小时正常运转。   动环监控系统,集安防、环境、动力三大系统监测功能于一体,适用场景不只是机房,通信基站、电力站房、档案库房、电梯间等场景,都能加强运行环境的稳定,这与动环监控系统的功能有直接关系。   监测功能   对机房内的安防系统、环境系统、动力系统等设备实时监控,检测参数有温湿度、漏水、烟雾、新风机、供配电、门禁、安防等,参数.

mengpp_123456的博客 1705

berserkJS —— 前端网络(性能)监测工具

berserkJS 详细介绍berserkJS 是基于 Qt (C++跨平台库)开发的前端网络(性能)监测工具。 它的核心功能是通过内置 webkit 收集由页面实际网络请求相关数据。 偏重于页面上线前检测与评估。 页面性能分析工具,可用 JS 编写自己的检测、分析规则。 基于 Qt 开发,可跨平台编译,部署。内置基于 QtWebkit 的浏览器环境。 ...

weixin_34368949的博客 452

基于Django框架的服务器监控系统详细设计与具体代码实现

1.背景介绍 在云计算和大数据时代,服务器的稳定性和性能监控成为了每个公司IT部门的重要工作。为了实现这个目标,我们需要一个强大的服务器监控系统。Django作为一种高级Python Web框架,它鼓励快速开发和干净、明智的设计。本文将详细介绍如何使用Django框架设计和实现一个服务器监控系统。 2.核心概

AI天才研究院 1220

别再混淆了!5分钟搞懂机器人导纳控制与阻抗控制的本质区别(附Simulink对比仿真)

本文深入解析机器人柔顺控制中的导纳控制与阻抗控制的本质区别,通过信号流方向、架构对比和应用场景三个关键视角进行详细阐述。文章还提供Simulink对比仿真案例,帮助读者快速理解两种控制策略的差异及其适用场景,特别适合机器人控制领域的研究者和工程师参考。

weixin_42543046的博客 605

服务监控实例

Java 服务监控 效果 pom 添加依赖: <!-- 获取系统信息 --> <dependency> <groupId>com.github.oshi</groupId> <artifactId>oshi-core</artifactId> <version>5.7.5</version> </dependency> <!-- 访问系统本地库 --> <d

小熊 519

MAPPO实战:从理论到代码的协作智能体训练指南

本文详细介绍了MAPPO算法在多智能体协作训练中的实战应用,从理论基础到代码实现全面解析。通过对比PPO与MAPPO的差异,深入讲解CTDE框架、网络架构设计、参数调优等关键环节,并提供实际项目中的调参经验和常见问题解决方案,帮助开发者快速掌握这一强化学习前沿技术。

weixin_42561040的博客 265

使用 Zabbix + Grafana 搭建服务器监控系统

本文作者是霍格沃兹测试学院优秀学员 xinxi ,某知名互联网公司测试开发工程师。本文是其在实际工作项目中的服务器监控从 0 到 1 实战总结。霍格沃兹测试学院会定期组织业界高手进行技术...

霍格沃兹测试学院的博客 1404

深入解析MSPM0系列Keil开发中‘ti_msp_dl_config.h‘缺失问题的根源与修复

本文深入解析TI MSPM0系列Keil开发中'ti_msp_dl_config.h'文件缺失问题的根源与修复方法。该错误常见于编译时提示file not found,主要因SysConfig工具未正确生成或工程路径配置错误导致。文章提供了从环境检查、手动生成文件到工程配置调整的系统化解决方案,帮助开发者快速解决这一常见KEIL开发难题。

gold的博客 970

基于STM32、HAL库的TPL0501数字电位器驱动程序设计

@param value 输出值(0-255)* @param hdev TPL0501句柄。* @param hdev TPL0501句柄。* @brief 获取TPL0501当前设置值。* @param hdev TPL0501句柄。* @brief 获取TPL0501当前设置值。* @brief 设置TPL0501输出值。* @brief 设置TPL0501输出值。* @return 当前值(0-255)* @brief 初始化TPL0501。* @brief 初始化TPL0501。

corlin6688的博客 1027

5分钟完成业务实时监控系统搭建,是一种什么样的体验?

公众号后台回复「产品手册」,下载电子书获取阿里云原生产品、实践与最新案例深圳市道旅旅游科技股份有限公司(简称:道旅)是一家总部位于中国的全球酒店资源批发商。自 2012 年成立以来,道旅...

阿里巴巴中间件 1693

用 CL_ABAP_PARALLEL 把批量处理跑进并行对话进程:资源配额、超时治理与可复制的落地模板

文章摘要: CL_ABAP_PARALLEL是SAP推荐的并行处理工具,适用于时间窗口受限的批量任务处理。它基于aRFC/pRFC机制,通过对话进程实现并行,能将小时级任务压缩到分钟级。使用时需注意版本兼容性(可能需要Note 2791374)、资源限制(会话数、进程数)和任务切片策略。提供两种实现方式:继承式(重定义do方法)和接口式(实现IF_ABAP_PARALLEL)。关键参数包括并发控制(p_percentage)、超时设置(p_timeout)和调试开关(p_debug)。最佳实践建议按业务维度

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 244

Netdata完整指南:如何快速部署实时服务器监控系统

Netdata是一款开源的实时服务器监控系统,能够以每秒收集指标的速度提供高性能监控解决方案。作为最先进的监控工具,Netdata支持800多种集成,从操作系统指标到容器、虚拟机和应用程序监控,为您的整个基础设施提供全面的可视化管理。🚀 ## 为什么选择Netdata监控系统? Netdata不仅是监控工具,更是完整的**实时性能分析平台**。与传统监控方案相比,它具有以下突出优势: -

gitblog_00657的博客 728

Unity零基础到进阶 ☀️| Unity中的 GC及优化 超级全面解析 ☆(ゝω・)v 建议收藏!

介绍: 在游戏运行的时候,数据主要存储在内存中,当游戏的数据在不需要的时候,存储当前数据的内存就可以被回收以再次使用。内存垃圾是指当前废弃数据所占用的内存,垃圾回收(GC)是指将废弃的内存重新回收再次使用的过程。 Unity中将垃圾回收当作内存管理的一部分,如果游戏中废弃数据占用内存较大,则游戏的性能会受到极大影响,此时垃圾回收会成为游戏性能的一大障碍点。 本文我们主要学习垃圾回收的机制,垃圾回收如何被触发以及如何提GC收效率来提高游戏的性能。 Unity内存管理机制简介 要想了解垃圾回收如何工作以及何时被

努力前行,总会成为自己心中的那道光 6万+

11.嵌入式控制器EC实战 KBC矩阵键盘Keyboard开发流程

文章目录笔记本矩阵键盘概述矩阵键盘的扫描方式行列扫描方式逐行逐列扫描方式EC中矩阵键盘是如何扫描并得到码值的(代码分析) 笔记本矩阵键盘概述 在EC中支持两种形式的键盘,一种是PS/2接口的键盘,这种键盘几乎已经被USB接口的键盘所取代,所以PS/2接口的键盘不在我们的讨论范围。 另一种键盘则是矩阵键盘,也是笔记本电脑的内置键盘,该键盘类似于学习单片机时使用的4*4的那种键盘,笔记本使用的矩阵键盘有三种规格,分别是16*8、17*8和18*8。16、17和18代表着该款键盘的列数,8代表着键盘的行数,我们这

qq_30135687的博客 3810

庐山派K230实战:构建低延迟Web摄像头监控系统

本文详细介绍了基于庐山派K230开发板构建低延迟Web摄像头监控系统的实战经验。通过利用K230强大的媒体编解码能力和一摄多路特性,结合MJPEG流技术,实现了端到端的实时观看,延迟可控制在数百毫秒内。文章涵盖了从硬件连接、网络配置到服务器搭建、图像优化的完整流程,并探讨了移动侦测、多客户端支持等智能扩展功能,为家庭安防和小型环境监测提供了高可控、高隐私的DIY解决方案。

5f4d3s2a1q的博客 544

Python爬虫实战:如何爬取京东商品评论数据

在本文中,我们介绍了如何使用 Python 爬虫技术爬取京东商品的评论数据。首先,我们分析了京东商品评论的 API 接口和 JSON 数据结构,然后编写了爬虫程序来抓取评论数据,并将数据保存到 CSV 文件中。接着,我们进行了一些基本的数据分析,包括评分分布和简单的情感分析。爬取京东商品评论的数据可以为电商分析、情感分析等提供有价值的信息。你可以在此基础上进行更深入的分析,挖掘更多的商业价值。希望本篇教程能够帮助你了解如何利用 Python 进行电商数据的爬取和分析!

2201_76125261的博客 1648

基于嵌入式WEB的视频服务器的设计与实现

1.引言     视频服务器一种对视音频数据进行压缩、存储及处理的专用嵌入式设备,它在远程监控及视频等方面都有广泛的应用。视频服务器采用MPEG4或MPEG2等压缩格式,在符合技术指标的情况下对视频数据进行压缩编码,以满足存储和传输的要求。随着音视频编码技术的不断发展和宽带网络技术的发展,视频传输的实现变得更容易和成本更低,使得视频传输的需求日益增长。基于嵌入式WEB的网络视频监控系统逐渐得到了

cjsycyl的专栏 1337

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

一款美观、优雅、轻量级的开源监控系统!用上它,逼格瞬间拉满

戳下方名片,关注并星标!回复“1024”获取2TB学习资源!????体系化学习:运维工程师打怪升级进阶之路 4.0— 特色专栏—MySQL/PostgreSQL/MongoDBElasticSearch/Hadoop/RedisKubernetes/Docker/DevOpsKafka/RabbitMQ/Zookeeper监控平台/应用与服务/集群管理N...

民工哥的博客 1391

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

企业级Ubuntu Server部署实战:从零搭建Web服务器

的云环境中验证过,他们的Ubuntu Server镜像已经预装了常用工具,通过网页终端就能完成全部配置。特别是用他们的一键部署功能测试Web服务时,不用自己准备服务器就能快速验证Nginx配置是否正确,非常方便新手排查问题。记录下整个安装配置过程,分享几个关键环节的经验。实际企业部署时还需要考虑备份策略、负载均衡等更多因素,但按照这个流程搭建的Ubuntu Server已经具备生产环境需要的基础安全性和可靠性。配置完成后在Ubuntu安装界面就能看到统一的虚拟磁盘,避免了软件RAID的性能开销。

OnyxPanther23的博客 928

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

基于DWR反向AJAX的Web监控系统(转)

<br />目前Web监控系统已经得到了普遍运用,许多新的监控系统都采用了Web作为监控系统的客户端,极大方便了监控系统的操作管理人员,减轻了监控系统的维护 成本。如何解决传统Web监控系统的数据读取请求/响应模式的缺点,以及监测数据显示页面刷新的难题[1],一直是Web监控系统开发人员不懈努力的难 题。 <br />    在实现Web监控系统的技术多种多样,各有千秋,AJAX技术成为首选之一,不论服务器端采用JavaEE还是MS.NET平台。虽然AJAX解决了整个 监控画面的局部刷新问题,

kongls08的专栏 1056
上一篇: SNMP常用OID
下一篇: java不用jni,也可以获得当前系统性能信息
Snoopy7713
博客等级 码龄21年 17粉丝 681原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值