java jmx

java jmx 在 Java 程序的运行过程中,对 JVM 和系统的监测一直是 Java 开发人员在开发过程所需要的。一直以来,Java 开发人员必须通过一些底层的 JVM API,比如 JVMPI 和 JVMTI 等,才能监测 Java 程序运行过程中的 JVM 和系统的一系列情况,这种方式一直以来被人所诟病,因为这需要大量的 C 程序和 JNI 调用,开发效率十分低下。于是出现了各种不同的专门做资源管理的程序包。为了解决这个问题,Sun 公司也在其 Java SE 5 版本中,正式提出了 Java 管理扩展 (Java Management Extensions,JMX) 用来管理检测 Java 程序 (同时 JMX 也在 J2EE 1.4 中被发布) 。 JMX 的提出,让 JDK 中开发自检测程序成为可能,也提供了大量轻量级的检测 JVM 和运行中对象 / 线程的方式,从而提高了 Java 语言自己的管理监测能力。 开启JMX,用 JVisvualVM, jmc 或 jconsole 连接JVM oracle jdk 自带JVisvualVM, jmc, openjdk 只有jconsole 通过jcmd开启 - 不需要重启JVM: # jmxremote.rmi.port: 监听jmx客户端的端口 # jmxremote.rmi.port: jmx数据传输端口,如果此项未配置,jmx会随机开一个新端口跟客户端传输数据. jcmd <PID> ManagementAgent.start \ jmxremote.port=1099 \ jmxremote.rmi.port=1099 \ jmxremote.ssl=false \ jmxremote.authenticate=false 关闭jmx jcmd <PID> ManagementAgent.stop 通过JVM启动参数开启,需要重启JVM. # JVM command line option: -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.rmi.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.54 注: ...

2017-02-07 · 1 min · 127 words · -

nice, cpulimit, cgroups 限制 cpu 占用率

nice, cpulimit, cgroups 限制 cpu 占用率 3 种控制进程运行时间的方法: 使用 nice 命令手动降低任务的优先级。 使用 cpulimit 命令不断的暂停进程,以控制进程所占用处理能力不超过特定限制。 使用linux内建的control groups (控制组) 功能,它提供了限制进程资源消耗的机制。 模拟高cpu占用率 https://caffinc.github.io/2016/03/cpu-load-generator/ nice命令 nice -n 10 bash # 不带后缀,查看当前nice值 nice 下面介绍一下nice命令的使用方法,nice命令可以修改进程的优先级,这样就可以让进程运行得不那么频繁。 这个功能在运行cpu密集型的后台进程或批处理作业时尤为有用。 nice值的取值范围是[-20,19],-20表示最高优先级,而19表示最低优先级。 Linux进程的默认nice值为0。使用nice命令 (不带任何参数时) 可以将进程的nice值设置为10。这样调度器就会将此进程视为较低优先级的进程,从而减少cpu资源的分配。 下面来看一个例子,我们同时运行两个 matho-primes 进程,一个使用nice命令来启动运行,而另一个正常启动运行: nice matho-primes 0 9999999999 > /dev/null & matho-primes 0 9999999999 > /dev/null & 再运行top命令。 看到没,正常运行的进程 (nice值为0) 获得了更多的cpu运行时间,相反的,用nice命令运行的进程占用的cpu时间会较少 (nice值为10) 。 在实际使用中,如果你要运行一个CPU密集型的程序,那么最好用nice命令来启动它,这样就可以保证其他进程获得更高的优先级。 也就是说,即使你的服务器或者台式机在重载的情况下,也可以快速响应。 renice renice -n 1 -p 14459 nice 还有一个关联命令叫做 renice,它可以在运行时调整进程的 nice 值。使用 renice 命令时,要先找出进程的 PID。下面是一个例子: ...

2017-02-07 · 3 min · 505 words · -

Retained Heap

Retained Heap http://supercharles888.blog.51cto.com/609344/1347144 为了开始研究,我们希望在memory 溢出时候能自动生成heap dump文件,为此,我们在运行时候添加JVM 参数: -XX:+HeapDumpOnOutOfMemoryError 然后,我们来做一系列实验来逐步研究各个有趣的问题。 实验1: 我们先来研究最简单的memory leak例子。我们先构造一个POJO类Person,这个Person类就是一般的java 类,然后我们构造一个ArrayList,然后在一个无限循环中一直放这个Person类的实例,因为Person类和ArrayList都在堆上,而ArrayList因为是强引用,所以无法被GC回收, (因为我们List一直在用并没有摧毁) 所以一旦ArrayList所占用的堆内存填满整个heap size时候,heap就溢出了。 POJO类代码是: package com.charles.research; /** 这是一个Person类,我用它来撑满heap @author charles.wang */ public class Person { private String name; private String sex; private int age; public Person( String name,String sex,int age){ this.name=name; this.sex=sex; this.age=age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; ...

2017-02-07 · 2 min · 386 words · -

pmap

pmap Pmap 命令: 查看进程用了多少内存, Linux Pmap Command - Find How Much Memory Process Use Pmap 提供了进程的内存映射, pmap 命令用于显示一个或多个进程的内存状态。其报告进程的地址空间和内存状态信息。 Pmap 实际上是一个 Sun OS 上的命令,linux 仅支持其有限的功能。但是它还是对查看完整的进程地址空间很有帮助。我们需要 PID 或者运行的进程的唯一进程ID来查看进程内存状态, 我们可以通过/proc 或者常规命令比如 top 或 ps 得到它。 语法或用法 pmap [options] PID 在输出中它显示全部的地址, kbytes, mode 还有 mapping。 选项 -p, -show-path Show full path to files in the mapping column -x extended 显示扩展格式 -d device 显示设备格式 -q quiet 不显示header/footer行 -V 显示版本信息 单一进程内存状态 [root@info ~]# pmap 1013 1013: /usr/sbin/sshd ...

2017-02-06 · 2 min · 382 words · -

NMT, Native Memory Tracking

NMT, Native Memory Tracking NMT for Hotspot VM is turned off by default. Turn this feature on using JVM command line option -XX:NativeMemoryTracking=[off | summary | detail] 注意,根据Java官方文档,开启NMT会有5%-10%的性能损耗; 访问NMT数据 JDK提供了jcmd命令来访问NMT数据: jcmd VM.native_memory [summary | detail | baseline | summary.diff | detail.diff | shutdown] [scale= KB | MB | GB] 配置项 说明 summary 只打印打印按分类汇总的内存 detail 打印按分类汇总的内存用法、virtual memory map和每次内存分配调用 baseline 创建内存快照,以比较不同时间的内存差异 summary.diff 打印自上次baseline到现在的内存差异,显示汇总信息 detail.diff 打印自上次baseline到现在的内存差异, 显示详细信息 shutdown 关闭NMT功能,NMT can be shutdown using jcmd utility, but can not start/restart using jcmd ...

2017-02-06 · 1 min · 90 words · -

jcmd

jcmd New Features in JDK7 update 4 JRockit command line utility JRCMD (JRockit Command). JRCMD was a command line tool to enumerate the Java processes running on the local machine, and to send commands (referred to as “Diagnostic Commands”) to them. JRCMD has been renamed JCMD (Java Command). jcmd用于向正在运行的JVM发送诊断信息请求,是从JDK1.7开始提供可以说是jstack和jps的结合体 #查看java进程, jcmd 不带参数时默认列出所有java进程。 jcmd [-l] # help jcmd PID help # For more information about a specific command, 查看某一个命令的帮助信息。 jcmd PID help ManagementAgent.start #打印线程栈 jcmd PID Thread.print # 打印线程栈 + 锁信息 jcmd PID Thread.print -l #打印 Thread.print 命令的帮助信息 kill -3 <PID> #仅限Linux平台 jstack <PID> # jcmd提供了输出HPROF格式的堆dump接口。运行jcmd GC.heap_dump 即可。 # 注意这里的FILENAME是相对于运行中的jvm目录来说的,因此避免找不到dump的文件,这里推荐使用绝对路径。此外,也建议使用.hprof作为输出文件的扩展名。 # hprof文件分析工具: NetBeans, Elipse的MAT,jhat jcmd PID GC.heap_dump /tmp/dump.hprof # 打印出堆直方图(同时也打印出存活对象的数目) jcmd <PID> GC.class_histogram #启动参数 jcmd <PID> VM.command_line #查看JVM参数, 如: -XX:MaxHeapSize, -XX:MaxNewSize jcmd <PID> VM.flags #uptime jcmd <PID> VM.uptime # 查看系统变量 jcmd <PID> VM.system_properties jcmd [ pid | main-class ] command [ arguments ] ...

2017-02-06 · 1 min · 213 words · -

mitmproxy

mitmproxy mitmproxy 是用 Python 和 C 开发的一个中间人代理软件 (man-in-the-middle proxy), 它可以用来拦截、修改、重放和保存 HTTP/HTTPS 请求。 它提供了两个命令行工具: mitmproxy 具备交互界面 mitmdump 不具备交互界面, 类似 tcpdump

2017-02-06 · 1 min · 19 words · -

java finalize

java finalize http://blog.csdn.net/walkerjong/article/details/6950091 Java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()。 (1).对象不一定会被回收。 (2).垃圾回收不是析构函数。 (3).垃圾回收只与内存有关。 (4).垃圾回收和finalize()都是靠不住的,只要JVM还没有快到耗尽内存的地步,它是不会浪费时间进行垃圾回收的。 有时当撤消一个对象时,需要完成一些操作。例如,如果一个对象正在处理的是非Java 资源,如文件句柄或window 字符字体,这时你要确认在一个对象被撤消以前要保证这些资源被释放。为处理这样的状况,Java 提供了被称为收尾 (finalization ) 的机制。使用该机制你可以定义一些特殊的操作,这些操作在一个对象将要被垃圾回收程序释放时执行。 要给一个类增加收尾 (finalizer ) ,你只要定义finalize ( ) 方法即可。Java 回收该类的一个对象时,就会调用这个方法。在finalize ( )方法中,你要指定在一个对象被撤消前必须执行的操作。垃圾回收周期性地运行,检查对象不再被运行状态引用或间接地通过其他对象引用。就在对象被释放之前,Java 运行系统调用该对象的finalize( ) 方法。 finalize()方法的通用格式如下: protected void finalize( ) { // finalization code here } 其中,关键字protected是防止在该类之外定义的代码访问finalize()标识符。该标识符和其他标识符将在第7章中解释。 理解finalize( ) 正好在垃圾回收以前被调用非常重要。例如当一个对象超出了它的作用域时,finalize( ) 并不被调用。这意味着你不可能知道何时——甚至是否——finalize( ) 被调用。因此,你的程序应该提供其他的方法来释放由对象使用的系统资源,而不能依靠finalize( ) 来完成程序的正常操作。 注意: 如果你熟悉C ,那你知道C 允许你为一个类定义一个撤消函数 (destructor ) ,它在对象正好出作用域之前被调用。Java不支持这个想法也不提供撤消函数。finalize() 方法只和撤消函数的功能接近。当你对Java 有丰富经验时,你将看到因为Java使用垃圾回收子系统,几乎没有必要使用撤消函数。 理解finalize()-析构函数的替代者 by Tim Gooch 在许多方面,Java 类似于 C++。Java 的语法非常类似于 C++,Java 有类、方法和数据成员;Java 的类有构造函数; Java 有异常处理。 但是,如果你使用过 C++ 会发现 Java 也丢掉一些可能是你熟悉的特性。这些特性之一就是析构函数。取代使用析构函数,Java 支持finalize() 方法。 ...

2017-02-06 · 3 min · 441 words · -

jdk tool, java tool, jvm tool

jdk tool, java tool, jvm tool jcmd Java 命令行(Java Command),用于向正在运行的JVM发送诊断命令请求。 jmc Java任务控制工具(Java Mission Control),主要用于HotSpot JVM的生产时间监测、分析、诊断。 https://blog.wiloon.com/?p=9724 java Java解释器/运行工具,用于运行.class 字节码文件或.jar文件。 javac Java编译工具(Java Compiler),用于编译Java源代码文件。将Java源代码转换成字节码。 jconsole 图形化用户界面的监测工具,主要用于监测并显示运行于Java平台上的应用程序的性能和资源占用等信息。 jhat Java堆分析工具(Java Heap Analysis Tool),用于分析Java堆内存中的对象信息。 jmap Java内存映射工具(Java Memory Map),主要用于打印指定Java进程、核心文件或远程调试服务器的共享对象内存映射或堆内存细节。 jstack Java堆栈跟踪工具,主要用于打印指定Java进程、核心文件或远程调试服务器的Java线程的堆栈跟踪信息。 wiloon.com/jstack jstat JVM统计监测工具(JVM Statistics Monitoring Tool),主要用于监测并显示JVM的性能统计信息。 https://blog.wiloon.com/?p=411 jstatd jstatd(VM jstatd Daemon)工具是一个RMI服务器应用,用于监测HotSpot JVM的创建和终止, 并提供一个接口,允许远程监测工具附加到运行于本地主机的JVM上。 jvisualvm JVM监测、故障排除、分析工具,主要以图形化界面的方式提供运行于指定虚拟机的Java应用程序的详细信息。 appletviewer 小程序浏览器,一种执行HTML文件上的Java小程序的Java浏览器。 (chrome, firefox 不再支持NPAPI) extcheck 扩展检测工具,主要用于检测指定jar文件与当前已安装的Java SDK扩展之间是否存在版本冲突。 idlj IDL转Java编译器(IDL-to-Java Compiler),用于为指定的IDL文件生成Java绑定。 IDL意即接口定义语言(Interface Definition Language)。 jar jar文件管理工具,主要用于打包压缩、解压jar文件。 jarsigner jar密匙签名工具。 javadoc Java文档工具, 主要用于根据Java 源代码中的注释信息生成HTML格式的API帮助文档。 ...

2017-02-06 · 2 min · 256 words · -

java io PrintStream

java io PrintStream http://www.cnblogs.com/skywang12345/p/io_16.html 本章介绍PrintStream以及 它与DataOutputStream的区别。我们先对PrintStream有个大致认识,然后再深入学习它的源码,最后通过示例加深对它的了解。 转载请注明出处: http://www.cnblogs.com/skywang12345/p/io_16.html PrintStream 介绍 PrintStream 是打印输出流,它继承于FilterOutputStream。 PrintStream 是用来装饰其它输出流。它能为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。 与其他输出流不同,PrintStream 永远不会抛出 IOException;它产生的IOException会被自身的函数所捕获并设置错误标记, 用户可以通过 checkError() 返回错误标记,从而查看PrintStream内部是否产生了IOException。 另外,PrintStream 提供了自动flush 和 字符集设置功能。所谓自动flush,就是往PrintStream写入的数据会立刻调用flush()函数。 PrintStream 函数列表 /* 构造函数 */ // 将"输出流out"作为PrintStream的输出流,不会自动flush,并且采用默认字符集 // 所谓"自动flush",就是每次执行print(), println(), write()函数,都会调用flush()函数; // 而"不自动flush",则需要我们手动调用flush()接口。 PrintStream(OutputStream out) // 将"输出流out"作为PrintStream的输出流,自动flush,并且采用默认字符集。 PrintStream(OutputStream out, boolean autoFlush) // 将"输出流out"作为PrintStream的输出流,自动flush,采用charsetName字符集。 PrintStream(OutputStream out, boolean autoFlush, String charsetName) // 创建file对应的FileOutputStream,然后将该FileOutputStream作为PrintStream的输出流,不自动flush,采用默认字符集。 PrintStream(File file) // 创建file对应的FileOutputStream,然后将该FileOutputStream作为PrintStream的输出流,不自动flush,采用charsetName字符集。 PrintStream(File file, String charsetName) // 创建fileName对应的FileOutputStream,然后将该FileOutputStream作为PrintStream的输出流,不自动flush,采用默认字符集。 PrintStream(String fileName) // 创建fileName对应的FileOutputStream,然后将该FileOutputStream作为PrintStream的输出流,不自动flush,采用charsetName字符集。 PrintStream(String fileName, String charsetName) ...

2017-02-04 · 4 min · 683 words · -

linux 设置 默认 声卡

linux 设置 默认 声卡 alsa设置默认声卡 2013-11-06 15:43 4650人阅读 评论(0) 收藏 举报 分类: gentoo (47) 版权声明: 本文为博主原创文章,未经博主允许不得转载。 首先说一下alsa的配置文件。alsa的配置文件是alsa.conf位于/usr/share/alsa目录下,通常还有/usr/share/alsa/card和/usr/share/alsa/pcm两个子目录用来设置card相关的参数,别名以及一些PCM默认设置。以上配置文件,我等凡夫从不用修改,修改它们是大神的工作。 还有两个配置文件/etc/asound.conf和~/.asoundrc,它俩有效是因为它俩被alsa.conf引用。以下是alsa.conf的原文: pre-load the configuration files @hooks [ { func load files [ { @func concat strings [ { @func datadir } “/alsa.conf.d/” ] } “/etc/asound.conf” “~/.asoundrc” ] errors false } ] 然后说我遇到的问题。为了提高本人的台式机的性能,在没有换主板的情况下升级了CPU和显卡。CPU没有造成什么影响,显卡是淘来的微星R6750暴雪1G,芯片为AMD Radeon HD 6750。由于它提供了一个HDMI接口,该接口还支持音频输出,于是麻烦出现了,在gentoo下,声音不走板载的HDA VIA VT82xx集成声卡,不知道走到哪里出去了,反正我的耳机没有声音。 找了好多文档,终于然我弄明白怎么回事了。 首先,如果机器有多于一个声卡,可以用下面的命令显示出来: $ cat /proc/asound/cards 0 [Generic ]: HDA-Intel - HD-Audio Generic HD-Audio Generic at 0xfe9bc000 irq 25 1 [VT82xx ]: HDA-Intel - HDA VIA VT82xx HDA VIA VT82xx at 0xfeafc000 irq 17 ...

2017-01-24 · 1 min · 202 words · -

设计模式 – State/状态模式

设计模式 – State/状态模式 State模式的定义: 不同的状态,不同的行为;或者说,每个状态有着相应的行为. 何时使用? State模式在实际使用中比较多,适合"状态的切换".因为我们经常会使用If elseif else 进行状态切换, 如果针对状态的这样判断切换反复出现,我们就要联想到是否可以采取State模式了. 不只是根据状态,也有根据属性.如果某个对象的属性不同,对象的行为就不一样,这点在数据库系统中出现频率比较高,我们经常会在一个数据表的尾部,加上property属性含义的字段,用以标识记录中一些特殊性质的记录,这种属性的改变(切换)又是随时可能发生的,就有可能要使用State. 是否使用? 在实际使用,类似开关一样的状态切换是很多的,但有时并不是那么明显,取决于你的经验和对系统的理解深度. 这里要阐述的是"开关切换状态" 和" 一般的状态判断"是有一些区别的, " 一般的状态判断"也是有 if..elseif结构,例如: if (which==1) state=“hello”; else if (which==2) state=“hi”; else if (which==3) state=“bye”; 这是一个 " 一般的状态判断",state值的不同是根据which变量来决定的,which和state没有关系.如果改成: if (state.euqals(“bye”)) state=“hello”; else if (state.euqals(“hello”)) state=“hi”; else if (state.euqals(“hi”)) state=“bye”; 这就是 “开关切换状态”,是将state的状态从"hello"切换到"hi",再切换到"“bye”;在切换到"hello",好象一个旋转开关,这种状态改变就可以使用State模式了. 如果单纯有上面一种将"hello"->“hi”->“bye”->“hello"这一个方向切换,也不一定需要使用State模式,因为State模式会建立很多子类,复杂化,但是如果又发生另外一个行为:将上面的切换方向反过来切换,或者需要任意切换,就需要State了. 请看下例: import java.awt.*; public class OldContext { private Color state = null; public void push() { //如果当前red状态 就切换到blue if (state == Color.red) state = Color.blue; //如果当前blue状态 就切换到green else if (state == Color.blue) state = Color.green; //如果当前black状态 就切换到red else if (state == Color.black) state = Color.red; //如果当前green状态 就切换到black else if (state == Color.green) state = Color.black; Sample sample = new Sample(state); sample.operate(); } public void pull() { //与push状态切换正好相反 if (state == Color.green) state = Color.blue; else if (state == Color.black) state = Color.green; else if (state == Color.blue) state = Color.red; else if (state == Color.red) state = Color.black; Sample sample2 = new Sample(state); sample2.operate(); } } 在上例中,我们有两个动作push推和pull拉,这两个开关动作,改变了Context颜色,至此,我们就需要使用State模式优化它. ...

2017-01-23 · 2 min · 394 words · -

java 运算符 优先级

java 运算符 优先级 http://blog.csdn.net/xiaoli_feng/article/details/4567184 在实际的开发中,可能在一个运算符中出现多个运算符,那么计算时,就按照优先级级别的高低进行计算,级别高的运算符先运算,级别低的运算符后计算,具体运算符的优先级见下表: 优先级 运算符 结合性 1 () [] . 从左到右 2 ! +(正) -(负) ~ ++ – 从右向左 3 * / % 从左向右 4 +(加) -(减) 从左向右 5 << >> »> 从左向右 6 < <= > >= instanceof 从左向右 7 == != 从左向右 8 &(按位与) 从左向右 9 ^ 从左向右 10 | 从左向右 11 && 从左向右 12 | 从左向右 13 ?: 从右向左 14 = += -= *= /= %= &= |= ^= ~= <<= >>= »>= 从右向左 说明: ...

2017-01-17 · 1 min · 111 words · -

traefik

traefik podman run -d \ --name traefik \ -p 80:80 \ -p 8080:8080 \ -v nginx-config:/etc/nginx \ -v nginx-www:/var/www \ -v cert:/etc/letsencrypt \ -v /etc/localtime:/etc/localtime:ro \ traefik:v2.9.6 dashboard http://192.168.50.51:8080/

2017-01-15 · 1 min · 29 words · -

数据库水平拆分垂直拆分

数据库水平拆分垂直拆分 垂直拆分:专库专用 什么是垂直拆分 一个数据库由很多表组成,每个表对应着不同的业务,垂直拆分是指按照业务将表分类,分布到不同的数据库上面,这样也就将数据或者说压力分担在不同的库上面了 在这里插入图片描述 例子 比如说一个新零售的电商数据库,我们可以把跟商品相关的数据表拆分成一个数据库,然后在这些数据表的基础之上,构建出商品系统。比如用JAVA或者PHP语言,创建出一个商城系统。然后把跟进销存相关的数据表拆分到另外一个数据库上,再用程序构建出仓库系统。 在这里插入图片描述 垂直拆分解决了什么问题 垂直拆分可以降低单节点数据库的负载。原来所有数据表都放在一个数据库节点上,无疑所有的读写请求也都发往这个MySQL上面,所以数据库的负载太高。如果一个节点的数据库拆分成多个MySQL数据库,这样就可以有效的降低每个MySQL的负载 垂直拆分不能解决什么问题 垂直节分不能解决的是缩表,比如说商品表无法划分个哪个数据库节点,商品表的记录还是那么多,不管你把数据库垂直拆分得有多细致,每个数据库里面的数据量时没有变化的。 MySQL单表记录超过2000万,读写性能会下降的很快,因此说垂直拆分不能起到缩表的效果。 优缺点 优点: 拆分后业务清晰,拆分规则明确 系统之间整合或者扩展容易 数据维护简单 缺点: 部分业务表无法join,只能通过接口方式解决,提高了系统复杂度 受每种业务不同的限制存在单裤性能瓶颈,不易数据扩展跟性能提高。 事务处理复杂 水平拆分:分库分表 什么是水平拆分 相对于垂直拆分的区别是:垂直拆分是把不同的表拆到不同的数据库中,而水平拆分是把同一个表拆到不同的数据库中。 相对于垂直拆分,水平拆分不是将表的数据做分类,而是按照某个字段的某种规则来分散到多个库之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中 的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中。 分库分表需要涉及到对应的SQL路由规则主库备库等,例如:淘宝设计了一套TDDL来解决这些问题,应用端只需配置对应的规则即可,对应用端的没有任何侵入的设计。 在这里插入图片描述 一个误解 很多人对水平切分存在误解,以为水平切分出来的数据表必须保存在不同的MySQL节点上。其实水平切分出来的数据表也可以保存在一个MySQL节点上面。不是水平切分一定需要多个MySQL节点。为什么这么说呢? MySQL自带一种数据分区的技术,可以把一张表的数据,按照特殊规则,切分存储在不同的目录下。 如果我们给Linux主机挂载了多块硬盘,我们完全可以利用MySQL分区技术,把一张表的数据切分存储在多个硬盘上。这样就由原来一块硬盘有限的IO能力,升级成了多个磁盘增强型的IO。 到底是应该先水平还是先垂直???? 先水平然后垂直的理由 感觉各有道理。但我支持先垂直,然后水平 在这里插入图片描述 数据库拆分原则: 优先考虑缓存降低对数据库的读操作 再考虑读写分离,降低数据库写操作 最后开始数据拆分: 先按照业务垂直拆分 在考虑水平拆分:先分库(设置数据路由规则,把数据分配到不同的库中) 最后在考虑分表,单表拆分到数据1000万以内。

2017-01-14 · 1 min · 44 words · -

System.exit(n)

System.exit(n) http://www.cnblogs.com/xwdreamer/archive/2011/01/07/2297045.html 1.参考文献 http://hi.baidu.com/accpzhangbo/blog/item/52aeffc683ee6ec238db4965.html 2.解析 查看java.lang.System的源代码,我们可以找到System.exit(status)这个方法的说明,代码如下: /** Terminates the currently running Java Virtual Machine. The argument serves as a status code; by convention, a nonzero status code indicates abnormal termination. This method calls the exit method in class Runtime. This method never returns normally. The call System.exit(n) is effectively equivalent to the call: Runtime.getRuntime().exit(n) @param status exit status. @throws SecurityException if a security manager exists and its checkExit ...

2017-01-06 · 1 min · 98 words · -

redis 主从复制

redis 主从复制 https://lanjingling.github.io/2015/11/17/redis-mast-slaveof/ Redis中,用户可以使用slaveof命令或者slaveof配置项,让一个服务器去复制另一个服务器。进行复制中的主从服务器双方的数据库将保存相同的数据 (一致性) 。 通过命令: 127.0.0.1:6380> slaveof 127.0.0.2 6379 上面的命令表示: 端口为6380的服务器 开始复制 端口为6379的服务器。 通过配置文件: 主服务器不用做任何修改,在从服务器的配置文件中作如下修改: slaveof 192.168.0.100 6379 (映射到主服务器上) 如果master设置了验证密码,还需配置masterauth。楼主的master设置了验证密码为admin,所以配置masterauth admin。配置完之后启动slave的Redis服务,OK,主从配置完成。 在master和slave分别执行info命令,查看结果如下, 主服务器: 9 Replication role:master connected_slaves:1 slave0:ip=127.0.0.2,port=6380,state=online,offset=10394,lag=0 master_repl_offset:10394 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:10393 从服务器: 16 Replication role:slave master_host:127.0.0.2 master_port:6379 master_link_status:up master_last_io_seconds_ago:3 master_sync_in_progress:0 slave_repl_offset:10436 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 注: 当从服务器执行了slaveof命令后,从服务器中原来的数据将清空,重新加载主服务器中的数据。 Redis2.8版本之前使用了旧版复制功能,2.8之后开始使用新版本的功能。 旧版复制: 旧版复制实现: 复制功能分为同步和命令传播两个步骤: 同步: 将从服务器的数据库状态更新成主服务器当前的数据库状态; 命令传播: 当主服务器的数据库状态被修改,导致主从服务器状态不一致,让主从服务器数据库状态重新回到一致状态; 同步: 当客户端向从服务器发送slaveof命令后,要求从服务器复制主服务器时,从服务器首先要执行同步操作,具体为从服务器向主服务器发送SYNC命令,步骤如下: 从服务器向主服务器发送SYNC命令; 收到SYNC命令的主服务器开始执行bgsave,在后台生成一个rdb文件;并用一个缓冲区记录从现在开始执行的所有写命令; 主服务器bgsave执行完毕后,将rdb文件发送给从服务器;从服务器收到后载入该rdb文件,将从数据库状态更新成主服务器执行bgsave时的状态; 主服务器将记录在缓冲区中的写命令发送给从服务器;从服务器执行这些命令,将其状态更新成主服务器当前的妆台; 命令传播: 在同步操作完毕后,主从服务器达到了一致的状态,但这种状态不是一成不变的。当主服务器执行了写操作后,主服务器会对从服务器执行命令传播操作,将相应的写命令发送给从服务器,从服务器执行该命令,从而达到一致性。 缺陷: 旧版复制过程中,如果主从服器出现断线,当从服务器重新连接上后,这时,由于主从服务器状态不一致,所以从服务器向主服务器发送SYNC命令。这时,主服务器会按照上面的步骤执行bgsave….操作。 ...

2017-01-06 · 1 min · 177 words · -

tcp MTU MSS

tcp MTU MSS MTU: Maxitum Transmission Unit 最大传输单元 检测需要设置的合理的值: 大部分网络设备都是 1500。如果本机的 MTU 比网关的 MTU 大,大的数据包就会被拆开来传送,这样会产生很多数据包碎片,增加丢包率,降低网络速度。把本机的 MTU 设成比网关的 MTU 小或相同,就可以减少丢包 Linux OS 检测网络 MTU: ping -s 1472 -M do 172.21.0.118 含义: 发送大小包大小是 1472(+28)字节,禁止路由器拆分数据包。 【 1472 + 8(ICMP回显示请求和回显应答报文格式长度) + 20(IP首部) = 1500 】 回复结果: 如果正常回复,说明网络允许最大MTU就是1500字节,与系统默认相同,只需将自己的路由的MTU也设置为1500即可。 如果没正常回复,说明数据包大小超过了网络限定的MTU大小。需要减小探测包大小再次尝试。 有些系统或网络 可能会返回建议的 MTU, ping: local error: Message too long, mtu=1364, 在这个值 基础上 -28 就是需要设置的 MTU, ip link set dev ens32 mtu 1336 iproute2 change link MTU 临时修改 MTU 重启后失效 ...

2016-12-30 · 7 min · 1441 words · -

redis 监控

redis 监控 http://ghoulich.xninja.org/2016/12/08/how-to-use-latency-monitor-in-redis/ Redis 2.8.13引入了一个新特性,叫做延迟监控 (Latency Monitoring) ,它可以帮助用户检查和定位可能的延迟问题。延迟监控由下面的几个组件构成: 延迟挂钩: 这个组件会对延迟敏感的各种代码路径进行采样。 时间序列: 这个组件会记录由各种事件造成的延迟飙升。 报告引擎: 这个组件会从时间序列中取出原始数据。 分析引擎: 这个组件会根据测量方法向用户提供易读的报告和提示信息。 本文只会详细描述延迟监控子系统的各项功能。如果想要了解如何检查和定位Redis的延迟问题,请参考《Redis延迟问题的排查方法》。 http://www.jianshu.com/p/68485d5c7fb9 Redis Server监控数据采集 ping,info all, slowlog get/len/reset/cluster info/config get Redis存活监控 redis存活监控 (redis_alive):redis本地监控agent使用ping,如果指定时间返回PONG表示存活,否则redis不能响应请求,可能阻塞或死亡。当返回值不为1时,redis挂了,告警 [root@tzgdevapp10 bin]# ./redis-cli -c -p 7000 ping | grep -c PONG 连接个数 (connected_clients): 客户端连接个数,如果连接数过高,影响redis吞吐量。>5000 时告警 [root@tzgdevapp10 bin]# ./redis-cli -c -p 7000 info | grep -w “connected_clients” | awk -F":" ‘{print $2}’ 连接数使用率(connected_clients_pct): 连接数使用百分比,通过(connected_clients/maxclients)计算;如果达到1,redis开始拒绝新连接创建,告警 拒绝的连接个数(rejected_connections): redis连接个数达到maxclients限制,拒绝新连接的个数。告警 [root@tzgdevapp10 bin]# ./redis-cli -c -p 7000 info | grep -w rejected_connections ...

2016-12-29 · 2 min · 346 words · -

OPTION SQL_SELECT_LIMIT

OPTION SQL_SELECT_LIMIT http://lucifer119.blog.51cto.com/2914308/1344253 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘OPTION SQL_SELECT_LIMIT=DEFAULT’ at line 1 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘OPTION SQL_SELECT_LIMIT=DEFAULT’ at line 1 原因: 项目中我用的jdbc驱动版本 MySQL-connector-java-5.1.15.jar MySQL数据库版本为5.6 jdbc在连接数据库时候会发送测试语句SET OPTION SQL_SELECT_LIMIT=DEFAULT 这在MySQL5.6以下版本是可以的 ,但是5.6不再支持SET… ...

2016-12-28 · 1 min · 77 words · -