sar command

sar command sar -n DEV 1 sar -n TCP,ETCP 1 Cannot open /var/log/sa/sa22: No such file or directory 22 是指当天的日期 这个是由于没有创建那sa22这个文件,这可以通过参数-o让其生成 sar -o 2 3 在对应的/var/log/sa/目录下就有对应的日志文件了 在运行就不会报错了 还有另外一种情况,因为刚刚装上sar所以还没有数据在/var/log/sa/sa22下,因为sar -n DEV 默认是是过去十分钟的系统活动报告。 pacman -S sysstat sar 找出系统瓶颈的利器 sar是System Activity Reporter (系统活动情况报告) 的缩写。sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统取样,获得大量的取样数据;取样数据和分析的结果都可以存入文件,所需的负载很小。sar是目前Linux上最为全面的系统性能分析工具之一,可以从14个大方面对系统的活动进行报告,包括文件的读写情况、系统调用的使用情况、串口、CPU效率、内存使用状况、进程活动及IPC有关的活动等,使用也是较为复杂。 sar是查看操作系统报告指标的各种工具中,最为普遍和方便的;它有两种用法; 追溯过去的统计数据 (默认) 周期性的查看当前数据 12.1. 追溯过去的统计数据 默认情况下,sar从最近的0点0分开始显示数据;如果想继续查看一天前的报告;可以查看保存在/var/log/sysstat/下的sa日志; 使用sar工具查看: $sar -f /var/log/sysstat/sa28 | head sar -r -f /var/log/sysstat/sa28 ../_images/sar1.png 12.2. 查看CPU使用率 sar -u : 默认情况下显示的cpu使用率等信息就是sar -u; ../_images/sar2.png 可以看到这台机器使用了虚拟化技术,有相应的时间消耗; 各列的指标分别是: %user 用户模式下消耗的CPU时间的比例; %nice 通过nice改变了进程调度优先级的进程,在用户模式下消耗的CPU时间的比例 %system 系统模式下消耗的CPU时间的比例; ...

2017-05-30 · 2 min · 291 words · -

busybox

busybox BusyBox 是一个提供了很多简化版的Unix 工具的一个可执行文件, busybox能在很多POSIX环境运行,比如Linux,Android,FreeBSD. BusyBox最初是由布鲁斯·斐伦斯在1996年为Debian GNU/Linux安装光盘而编写 Busybox只提供每个工具程序的简化版 (例如: ls指令不提供排序功能) 。 BusyBox 是一个集成了一百多个最常用linux命令和工具的软件,他甚至还集成了一个http服务器和一个telnet服务器,而所有这一切功能却只有区区1M左右的大小。BusyBox 包含了一些简单的工具,比如: 我们平时用的那些linux命令就好比是分立式的电子元件,而busybox就好比是一个集成电路,把常用的工具和命令集成压缩在一个可执行文件里,功能基本不变,而大小却小很多倍,例如ls、 cat 和 echo等等,还包含了一些更大、更复杂的工具,例如 grep、find、mount 以及telnet。简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux 的许多工具和命令,也包含了 Android 系统自带的shell。BusyBox 将许多具有共性的小版本的UNIX工具结合到一个单一的可执行文件。这样的集合可以替代大部分常用工具比如: GNU 等工具,BusyBox提供了一个比较完善的环境,可以适用于任何小的或嵌入式系统。在嵌入式linux应用中,busybox有非常广的应用,另外,大多数linux发行版的安装程序中都有busybox的身影,安装linux的时候案ctrl+alt+F2可以切换物理终端,而这个物理终端中的所有命令都是指向busybox的链接.Busybox虽小,但作用确是惊人的,这样就可以基于Busybox制作一张软盘linux。 http://jilili.blog.51cto.com/6617089/1170368 https://busybox.net/ https://en.wikipedia.org/wiki/BusyBox

2017-05-27 · 1 min · 30 words · -

java 监视器

java 监视器 http://ifeve.com/monitors-java-synchronization-mechanism/ 监视器–JAVA同步基本概念 大学有一门课程叫操作系统,学习过的同学应该都记得,监视器是操作系统实现同步的重要基础概念,同样它也用在JAVA的线程同步中,这篇文章用一种类推的思想解释监视器"monitor"。 1.什么是监视器 监视器可以看做是经过特殊布置的建筑,这个建筑有一个特殊的房间,该房间通常包含一些数据和代码,但是一次只能一个消费者(thread)使用此房间, Java-Monitor 当一个消费者(线程)使用了这个房间,首先他必须到一个大厅(Entry Set)等待,调度程序将基于某些标准(e.g. FIFO)将从大厅中选择一个消费者(线程),进入特殊房间,如果这个线程因为某些原因被"挂起",它将被调度程序安排到"等待房间",并且一段时间之后会被重新分配到特殊房间,按照上面的线路,这个建筑物包含三个房间,分别是"特殊房间"、“大厅"以及"等待房间”。 java-monitor-associate-with-object 简单来说,监视器用来监视线程进入这个特别房间,他确保同一时间只能有一个线程可以访问特殊房间中的数据和代码。 2.JAVA中监视器的实现 在JAVA虚拟机中,每个对象(Object和class)通过某种逻辑关联监视器,为了实现监视器的互斥功能,每个对象(Object和class)都关联着一个锁(有时也叫"互斥量"),这个锁在操作系统书籍中称为"信号量",互斥(“mutex “)是一个二进制的信号量。 如果一个线程拥有了某些数据的锁,其他的线程则无法获得锁,直到这个线程释放了这个锁。在多线程中,如果任何时候都是我们自己来写这个信号量,显然不是很方便,幸运的是,JVM为我们自动实现了这些。 为了使数据不被多个线程访问,java 提供了同步块 以及 同步方法两种实现,一旦一段代码被嵌入到一个synchronized关键字中,意味着放入了监视区域,JVM在后台会自动为这段代码实现锁的功能。 3.JAVA的同步代码中,哪一部分是监视器? 我们知道JAVA每个对象(Object/class) 都关联一个监视器,更好的说法应该是每个对象(Object/class)都有一个监视器,对象可以有它自己的临界区,并且能够监视线程序列为了使线程协作,JAVA为提供了wait()和notifyAll以及notify()实现挂起线程,并且唤醒另外一个等待的线程,此外这些方法有三种不同版本: wait(long timeout, int nanos) wait(long timeout) notified by other threads or notified by timeout. notify(all) 这些方法只能在一个同步块或同步方法中被调用,原因是,如果一个方法不需要相互排斥,不需要监测或线程之间协作,每一个线程可以自由访问此方法,那就不需要协作。

2017-05-25 · 1 min · 40 words · -

hbase BufferedMutator

hbase BufferedMutator org.apache.hadoop.hbase.client.BufferedMutator主要用来对HBase的单个表进行操作。它和Put类的作用差不多,但是主要用来实现批量的异步写操作。 BufferedMutator替换了HTable的setAutoFlush(false)的作用。 可以从Connection的实例中获取BufferedMutator的实例。在使用完成后需要调用close()方法关闭连接。对BufferedMutator进行配置需要通过BufferedMutatorParams完成。 MapReduce Job的是BufferedMutator使用的典型场景。MapReduce作业需要批量写入,但是无法找到恰当的点执行flush。BufferedMutator接收MapReduce作业发送来的Put数据后,会根据某些因素 (比如接收的Put数据的总量) 启发式地执行Batch Put操作,且会异步的提交Batch Put请求,这样MapReduce作业的执行也不会被打断。 BufferedMutator也可以用在一些特殊的情况上。MapReduce作业的每个线程将会拥有一个独立的BufferedMutator对象。一个独立的BufferedMutator也可以用在大容量的在线系统上来执行批量Put操作,但是这时需要注意一些极端情况比如JVM异常或机器故障,此时有可能造成数据丢失。

2017-05-22 · 1 min · 12 words · -

堆内内存, 堆外内存

堆内内存, 堆外内存 一、什么是堆外内存 堆内内存 (on-heap memory) 回顾 堆外内存和堆内内存是相对的二个概念,其中堆内内存是我们平常工作中接触比较多的,我们在jvm参数中只要使用-Xms,-Xmx等参数就可以设置堆的大小和最大值,理解jvm的堆还需要知道下面这个公式: 堆内内存 = 新生代+老年代+持久代 如下面的图所示: Paste_Image.png 在使用堆内内存 (on-heap memory) 的时候,完全遵守JVM虚拟机的内存管理机制,采用垃圾回收器 (GC) 统一进行内存管理,GC会在某些特定的时间点进行一次彻底回收,也就是Full GC,GC会对所有分配的堆内内存进行扫描,在这个过程中会对JAVA应用程序的性能造成一定影响,还可能会产生Stop The World。 常见的垃圾回收算法主要有: 引用计数器法 (Reference Counting) 标记清除法 (Mark-Sweep) 复制算法 (Coping) 标记压缩法 (Mark-Compact) 分代算法 (Generational Collecting) 分区算法 (Region) 注: 在这里我们不对各个算法进行深入介绍,感兴趣的同学可以关注我的下一篇关于垃圾回收算法的介绍分享。 堆外内存 (off-heap memory) 介绍 和堆内内存相对应,堆外内存就是把内存对象分配在Java虚拟机的堆以外的内存,这些内存直接受操作系统管理 (而不是虚拟机) ,这样做的结果就是能够在一定程度上减少垃圾回收对应用程序造成的影响。 作为JAVA开发者我们经常用java.nio.DirectByteBuffer对象进行堆外内存的管理和使用,它会在对象创建的时候就分配堆外内存。 DirectByteBuffer类是在Java Heap外分配内存,对堆外内存的申请主要是通过成员变量unsafe来操作,下面介绍构造方法 DirectByteBuffer(int cap) { super(-1, 0, cap, cap); //内存是否按页分配对齐 boolean pa = VM.isDirectMemoryPageAligned(); //获取每页内存大小 int ps = Bits.pageSize(); //分配内存的大小,如果是按页对齐方式,需要再加一页内存的容量 long size = Math.max(1L, (long)cap + (pa ? ps : 0)); //用Bits类保存总分配内存(按页分配)的大小和实际内存的大小 Bits.reserveMemory(size, cap); long base = 0; try { //在堆外内存的基地址,指定内存大小 base = unsafe.allocateMemory(size); } catch (OutOfMemoryError x) { Bits.unreserveMemory(size, cap); throw x; } unsafe.setMemory(base, size, (byte) 0); //计算堆外内存的基地址 if (pa && (base % ps != 0)) { // Round up to page boundary address = base + ps - (base & (ps - 1)); } else { address = base; } cleaner = Cleaner.create(this, new Deallocator(base, size, cap)); att = null; } 注: 在Cleaner 内部中通过一个列表,维护了一个针对每一个 directBuffer 的一个回收堆外内存的 线程对象(Runnable),回收操作是发生在 Cleaner 的 clean() 方法中。 ...

2017-05-17 · 3 min · 470 words · -

Java8 jdeps

Java8 jdeps http://blog.csdn.net/u013803262/article/details/70570161 Java8中带了一个新的类依赖分析器。 我们可以在Java的安装目录的bin目录下看到jdeps.exe这个文件。 这个工具是用于分析类的依赖关系的。 具体怎么用 可以这样。 找一个目录,下面全是jar文件。那么这样的目录很明显WEB-INF下的lib目录就非常合适。 假设我们有一个web项目,tomcat下的lib有 commons-pool2-2.0.jar jedis-2.5.1.jar 为了使得结构简单点。我们只加入了两个jar包并且jedis包依赖于commons-pool这个包。 我们进入lib目录下运行命令 jdeps *.jar 结果得到 E:\git_tmp\distributedSession\target\distributedSession\WEB-INF\lib>jdeps *.jar commons-pool2-2.0.jar -> F:\Program Files\Java\jdk1.8.0_121\jre\lib\rt.jar commons-pool2-2.0.jar -> 找不到 org.apache.commons.pool2 (commons-pool2-2.0.jar) -> java.io -> java.lang -> java.util -> java.util.concurrent.locks org.apache.commons.pool2.impl (commons-pool2-2.0.jar) -> java.io -> java.lang -> java.lang.management -> java.lang.ref -> java.lang.reflect -> java.security -> java.text -> java.util -> java.util.concurrent -> java.util.concurrent.atomic -> java.util.concurrent.locks -> javax.management -> org.apache.commons.pool2 commons-pool2-2.0.jar org.apache.commons.pool2.proxy (commons-pool2-2.0.jar) -> java.lang -> java.lang.reflect ...

2017-05-17 · 1 min · 151 words · -

Deprecate HTablePool

Deprecate HTablePool https://issues.apache.org/jira/browse/HBASE-6580 http://blog.csdn.net/jiyiqinlovexx/article/details/36526433 http://blog.csdn.net/u010967382/article/details/38046821

2017-05-16 · 1 min · 5 words · -

HBase的WAL机制 WAL (Write-Ahead-Log)

HBase的WAL机制 WAL (Write-Ahead-Log) WAL机制解析 WAL(Write-Ahead Logging)是一种高效的日志算法,几乎是所有非内存数据库提升写性能的不二法门,基本原理是在数据写入之前首先顺序写入日志,然后再写入缓存,等到缓存写满之后统一落盘。之所以能够提升写性能,是因为WAL将一次随机写转化为了一次顺序写加一次内存写。提升写性能的同时,WAL可以保证数据的可靠性,即在任何情况下数据不丢失。假如一次写入完成之后发生了宕机,即使所有缓存中的数据丢失,也可以通过恢复日志还原出丢失的数据。 WAL持久化等级 HBase中可以通过设置WAL的持久化等级决定是否开启WAL机制、以及HLog的落盘方式。WAL的持久化等级分为如下四个等级: SKIP_WAL: 只写缓存,不写HLog日志。这种方式因为只写内存,因此可以极大的提升写入性能,但是数据有丢失的风险。在实际应用过程中并不建议设置此等级,除非确认不要求数据的可靠性。 ASYNC_WAL: 异步将数据写入HLog日志中。 SYNC_WAL: 同步将数据写入日志文件中,需要注意的是数据只是被写入文件系统中,并没有真正落盘。 FSYNC_WAL: 同步将数据写入日志文件并强制落盘。最严格的日志写入等级,可以保证数据不会丢失,但是性能相对比较差。 USER_DEFAULT: 默认如果用户没有指定持久化等级,HBase使用SYNC_WAL等级持久化数据。 用户可以通过客户端设置WAL持久化等级,代码: put.setDurability(Durability. SYNC_WAL ); HLog数据结构 HBase中,WAL的实现类为HLog,每个Region Server拥有一个HLog日志,所有region的写入都是写到同一个HLog。下图表示同一个Region Server中的3个 region 共享一个HLog。当数据写入时,是将数据对<HLogKey,WALEdit>按照顺序追加到HLog中,以获取最好的写入性能。 WAL(Write-Ahead-Log)预写日志是HBase的RegionServer在处理数据插入和删除的过程中用来记录操作内容的一种日志。在每次Put、Delete等一条记录时,首先将其数据写入到RegionServer对应的HLog文件的过程。 客户端往RegionServer端提交数据的时候,会先写WAL日志,只有当WAL日志写成功以后,客户端才会被告诉提交数据成功,如果写WAL失败会告知客户端提交失败,换句话说这其实是一个数据落地的过程。 在一个RegionServer上的所有的Region都共享一个HLog,一次数据的提交是先写WAL,写入成功后,再写memstore。当memstore值到达一定是,就会形成一个个StoreFile (理解为HFile格式的封装,本质上还是以HFile的形式存储的) 。 HLog类 RegionServer内WAL文件与Region的关系图 WAL的实现类是HLog,当一个Region被初始化的时候,一个HLog的实例会作为构造函数的参数传进去。 当Region在处理Put、Delete等更新操作时,可以直接使用该共享的HLog的append方法来落地数据。 Put、Delete在客户端上可以通过setWriteToWAL(false)方法来关闭该操作的日志,这么做虽然可以提升入库速度,但最好别这么做,因为有数据丢失的风险存在。 http://www.zkread.com/article/69288.html http://hbasefly.com/2016/03/23/hbase_writer/

2017-05-09 · 1 min · 40 words · -

锁定读, 一致性非锁定读

锁定读, 一致性非锁定读 http://ju.outofmemory.cn/entry/275548 锁定读 (Locking Reads) 在一个事务中查询数据时,普通的SELECT语句不会对查询的数据进行加锁,其他事务仍可以对查询的数据执行更新和删除操作。因此,InnoDB提供了两种类型的锁定读来保证额外的安全性: - SELECT … LOCK IN SHARE MODE - SELECT … FOR UPDATE SELECT … LOCK IN SHARE MODE: 对读取的行添加S锁,其他事物可以对这些行添加S锁,若添加X锁,则会被阻塞。 SELECT … FOR UPDATE: 会对查询的行及相关联的索引记录加X锁,其他事务请求的S锁或X锁都会被阻塞。 当事务提交或回滚后,通过这两个语句添加的锁都会被释放。 注意: 只有在自动提交被禁用时, SELECT FOR UPDATE 才可以锁定行, 若开启自动提交, 则匹配的行不会被锁定。 一致性非锁定读 (Consistent Nonlocking Reads) MySQL官方文档对弈一致性读的定义: > A consistent read means that InnoDB uses multi-versioning to present to a query a snapshot of the database at a point in time. 就是说: 一致性读意味着InnoDB使用多版本控制来实现一个查询,这个查询所依赖的数据是基于某个时间点的数据库快照。 注意: 是数据库的快照,而不是要查询的那个表的快照。 在事务隔离级别设置为READ COMMITTED和REPEATABLE READ时,默认情况下InnoDB是通过一致性读来处理SELECT语句的。一致性读不会对它访问的表设置任何锁,因此,在一个表上进行一致性读的同时,其他session可以随意修改这些表。 一致性读是使用基于时间点的快照信息来呈现查询结果的读取操作,而不管其他事务在同一时间产生的变更。如果查询的数据已被其他事务改变,InnoDB会基于undo log的内容来重建最初的数据。 两种事务隔离级别下,读取的快照数据的区别: - 在REPEATABLE READ事务隔离级别下,同一事务内的所有一致性读都会读取到该事务中第一个一致性读建立的快照。通过提交当前事务并发起一个新的查询,可以看得到新的快照。 - 在READ COMMITTED事务隔离级别下,同一事务内的每个一致性读总是读取本次一致性读建立的快照。(即,快照的时间点是基于本次一致性读的时间点,也就是最新的数据) 假设当前事务隔离级别为REPEATABLE READ,当发出一个一致性读(也就是一个普通的SELECT语句)时,InnoDB会根据这个查询给此事务分配一个时间点。若其他事务在此时间点之后删除了一行并提交,那么此事务不会看到其他事务产生的影响(即,还是会看到被删除的行)。插入和更新操作也一样。

2017-05-09 · 1 min · 87 words · -

Locked ownable synchronizers

Locked ownable synchronizers An ownable synchronizer is a synchronizer that may be exclusively owned by a thread and uses AbstractOwnableSynchronizer (or its subclass) to implement its synchronization property. ReentrantLock and ReentrantReadWriteLock are two examples of ownable synchronizers provided by the platform. http://stackoverflow.com/questions/41300520/what-is-locked-ownable-synchronizers-in-thread-dump

2017-05-05 · 1 min · 42 words · -

java jps

java jps jps位于jdk的bin目录下,其作用是显示当前系统的java进程情况,及其id号。 jps相当于Solaris进程工具ps。不象"pgrep java"或"ps -ef grep java",jps并不使用应用程序名来查找JVM实例。因此,它查找所有的Java应用程序,包括即使没有使用java执行体的那种 (例如,定制的启动 器) 。另外,jps仅查找当前用户的Java进程,而不是当前系统中的所有进程。 -h: help -l: 输出应用程序main class的完整package名 或者 应用程序的jar文件完整路径名 -m: 输出传递给main 方法的参数,在嵌入式jvm上可能是null, 在这里,在启动main方法的时候,我给String[] args传递两个参数。hollis,chuang,执行jsp -m: -v: 输出传递给JVM的参数 在这里,在启动main方法的时候,我给jvm传递一个参数: -Dfile.encoding=UTF-8,执行jps -v: 位置 我们知道,很多Java命令都在jdk的JAVA_HOME/bin/目录下面,jps也不例外,他就在bin目录下,所以,他是java自带的一个命令。 功能 jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。 原理 jdk中的jps命令可以显示当前运行的java进程以及相关参数,它的实现机制如下: java程序在启动以后,会在java.io.tmpdir指定的目录下,就是临时文件夹里,生成一个类似于hsperfdata_User的文件夹,这个文件夹里 (在Linux中为/tmp/hsperfdata_{userName}/) ,有几个文件,名字就是java进程的pid,因此列出当前运行的java进程,只是把这个目录里的文件名列一下而已。 至于系统的参数什么,就可以解析这几个文件获得。 hollis@hos:/tmp/hsperfdata_hollis$ pwd /tmp/hsperfdata_hollis hollis@hos:/tmp/hsperfdata_hollis$ ll total 48 drwxr-xr-x 2 hollis hollis 4096 4月 16 10:54 ./ drwxrwxrwt 7 root root 12288 4月 16 10:56 ../ ...

2017-05-05 · 2 min · 222 words · -

自旋锁/Spin lock

自旋锁/Spin lock public class SpinLock { private AtomicReference<Thread> sign =new AtomicReference<>(); public void lock(){ Thread current = Thread.currentThread(); while(!sign.compareAndSet(null, current)){ } } public void unlock (){ Thread current = Thread.currentThread(); sign.compareAndSet(current, null); } } // another spin lock for (;;) { if (condition == true) break; } 自旋锁是为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,“自旋"一词就是因此而得名。 自旋锁适用于锁保护的临界区很小的情况,临界区很小的话,锁占用的时间就很短。 自旋锁一般原理 跟互斥锁一样,一个执行单元要想访问被自旋锁保护的共享资源,必须先得到锁,在访问完共享资源后,必须释放锁。如果在获取自旋锁时,没有任何执行单元保持该锁,那么将立即得到锁;如果在获取自旋锁时锁已经有保持者,那么获取锁操作将自旋在那里,直到该自旋锁的保持者释放了锁。由此我们可以看出,自旋锁是一种比较低级的保护数据结构或代码片段的原始方式,这种锁可能存在两个问题: 死锁和过多占用cpu资源。 自旋锁适用情况 ...

2017-05-04 · 1 min · 72 words · -

systemtap

systemtap http://www.cnblogs.com/hazir/p/systemtap_introduction.html 内核探测工具systemtap简介 systemtap是内核开发者必须要掌握的一个工具,本文我将简单介绍一下此工具,后续将会有系列文章介绍systemtap的用法。 什么是systemtap 假如现在有这么一个需求: 需要获取正在运行的 Linux 系统的信息,如我想知道系统什么时候发生系统调用,发生的是什么系统调用等这些信息,有什么解决方案呢? 最原始的方法是,找到内核系统调用的代码,加上我们需要获得信息的代码、重新编译内核、安装、选择我们新编译的内核重启。这种做法对于内核开发人员简直是梦魇,因为一遍做下来至少得需要1个多小时,不仅破坏了原有内核代码,而且如果换了一个需求又得重新做一遍上面的工作。所以,这种调试内核的方法效率是极其底下的。 之后内核引入了一种Kprobe机制,可以用来动态地收集调试和性能信息的工具,是一种非破坏性的工具,用户可以用它跟踪运行中内核任何函数或执行的指令等。相比之前的做法已经有了质的提高了,但Kprobe并没有提供一种易用的框架,用户需要自己去写模块,然后安装,对用户的要求还是蛮高的。 systemtap 是利用Kprobe 提供的API来实现动态地监控和跟踪运行中的Linux内核的工具,相比Kprobe,systemtap更加简单,提供给用户简单的命令行接口,以及编写内核指令的脚本语言。对于开发人员,systemtap是一款难得的工具。 下面将会介绍systemtap的安装、systemtap的工作原理以及几个简单的示例。 systemtap 的安装 我的主机 Linux 发行版是32位 Ubuntu13.04,内核版本 3.8.0-30。由于 systemtap 运行需要内核的调试信息支撑,默认发行版的内核在配置时这些调试开关没有打开,所以安装完systemtap也是无法去探测内核信息的。 下面我以两种方式安装并运行 systemtap: 方法一 编译内核以支持systemtap 我们重新编译内核让其支持systemtap,首先你想让内核中有调试信息,编译内核时需要加上 -g 标志;其次,你还需要在配置内核时将 Kprobe 和 debugfs 开关打开。最终效果是,你能在内核 .config 文件中看到下面四个选项是设置的: CONFIG_DEBUG_INFO CONFIG_KPROBES CONFIG_DEBUG_FS CONFIG_RELAY 配置完之后,按照之前你编译内核的步骤编译即可。 获取systemtap源码 从此地址 https://sourceware.org/systemtap/ftp/releases下载已经发布的systemtap的源代码,截至目前 (2013.9.17) 最新版本为systemtap-2.3。下载完之后解压。 当然你还可以使用 git 去克隆最新的版本 (2.4) ,命令如下: git clone git://sources.redhat.com/git/systemtap.git 编译安装systemtap 如果你下载的是最新版本的systemtap,那么你需要新版的 elfutils,可以从https://fedorahosted.org/releases/e/l/elfutils/ 下载elfutils-0.156 版本。下载之后解压缩到适合的目录 (我放在~/Document/ 下) ,不需要安装,只要配置systemtap时指定其位置即可。 进入之前解压systemtap的目录,使用下面命令进行配置: ./configure -with-elfutils=~/Document/elfutils-0.156 以这里方法配置之后,你只需要再运行 make install 即完成systemtap的编译安装。如果需要卸载的话,运行 make uninstall。 ...

2017-05-04 · 2 min · 258 words · -

内核空间, 用户空间; kernel mode/user mode, User space/Kernel space

内核空间, 用户空间; kernel mode/user mode, User space/Kernel space User space & Kernel space 现代操作系统会把内存划分为2个区域,分别为Use space(用户空间) 和 Kernel space(内核空间)。用户的程序在User space执行,系统内核在Kernel space中执行。 用户的程序没有权限直接访问硬件资源,但系统内核可以。比如读写本地文件需要访问磁盘,创建socket需要网卡等。因此用户程序想要读写文件,必须要向内核发起读写请求,这个过程叫system call。 内核收到用户程序system call时,负责访问硬件,并把结果返回给程序。 FileInputStream fis = new FileInputStream("/tmp/test.txt"); byte[] buf = new byte[256]; fis.read(buf); 简单说,Kernel space 是 Linux 内核的运行空间,User space 是用户程序的运行空间。为了安全,它们是隔离的,即使用户的程序崩溃了,内核也不受影响。 Kernel space 可以执行任意命令,调用系统的一切资源;User space 只能执行简单的运算,不能直接调用系统资源,必须通过系统接口 (又称 system call) ,才能向内核发出指令。 str = “my string” // 用户空间 x = x + 2 file.write(str) // 切换到内核空间 y = x + 4 // 切换回用户空间 上面代码中,第一行和第二行都是简单的赋值运算,在 User space 执行。第三行需要写入文件,就要切换到 Kernel space,因为用户不能直接写文件,必须通过内核安排。第四行又是赋值运算,就切换回 User space。 ...

2017-04-25 · 2 min · 387 words · -

MySQL 共享锁 排他锁

‘MySQL 共享锁 排他锁’ http://www.hollischuang.com/archives/923 共享锁(Share Lock) 共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改 (获取数据上的排他锁) ,直到已释放所有共享锁。 如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。 用法 SELECT … LOCK IN SHARE MODE; 在查询语句后面增加LOCK IN SHARE MODE,MySQL会对查询结果中的每行都加共享锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请共享锁,否则会被阻塞。其他线程也可以读取使用了共享锁的表,而且这些线程读取的是同一个版本的数据。 排他锁 (eXclusive Lock) 排他锁又称写锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。 用法 SELECT … FOR UPDATE; 在查询语句后面增加FOR UPDATE,MySQL会对查询结果中的每行都加排他锁,当没有其他线程对查询结果集中的任何一行使用排他锁时,可以成功申请排他锁,否则会被阻塞。 意向锁 意向锁是表级锁,其设计目的主要是为了在一个事务中揭示下一行将要被请求锁的类型。InnoDB中的两个表锁: 意向共享锁 (IS) : 表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的IS锁 意向排他锁 (IX) : 类似上面,表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先取得该表的IX锁。 意向锁是InnoDB自动加的,不需要用户干预。 对于insert、update、delete,InnoDB会自动给涉及的数据加排他锁 (X) ;对于一般的Select语句,InnoDB不会加任何锁,事务可以通过以下语句给显示加共享锁或排他锁。 共享锁: SELECT … LOCK IN SHARE MODE; 排他锁: SELECT … FOR UPDATE;

2017-04-12 · 1 min · 58 words · -

MySQL分区表, partition

MySQL分区表, partition 没有分区的表创建分区 partition management on a not partitioned table is not possible ALTER TABLE table0 PARTITION BY RANGE (to_days(field0)) ( PARTITION p201908 VALUES less THAN (737668), PARTITION p201909 VALUES LESS THAN (737698), PARTITION p201910 VALUES LESS THAN (737729), PARTITION p201911 VALUES LESS THAN (737759), PARTITION p201912 VALUES LESS THAN (737790) ) ALTER TABLE table0 PARTITION BY RANGE (to_days(field0)) ( PARTITION p202007 VALUES less THAN (to_days('2020-08-01')), PARTITION p202008 VALUES less THAN (to_days('2020-09-01')), PARTITION p202009 VALUES less THAN (to_days('2020-10-01')), PARTITION p202010 VALUES less THAN (to_days('2020-11-01')), PARTITION p202011 VALUES less THAN (to_days('2020-12-01')), PARTITION p202012 VALUES less THAN (to_days('2021-01-01')), ) 添加分区 alter TABLE table0 add PARTITION ( PARTITION p201908 VALUES less THAN (737668)); alter table table0 add PARTITION ( PARTITION pmax VALUES less than MAXVALUE); -- check partition size USE information_schema; SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 't0' and PARTITION_NAME='p0'; -- drop partition ALTER TABLE `db0`.t0 DROP PARTITION p0; 查看分区的存储情况 SELECT partition_name, PARTITION_DESCRIPTION, PARTITION_EXPRESSION, table_rows FROM information_schema.partitions WHERE table_name = 'table0' 查询 查询的where条件要写完整的时间范围, 只写> 或者只写<, 会导致查询所有的分区. ...

2017-04-07 · 5 min · 981 words · -

archlinux, tensorFlow, golang

archlinux, tensorFlow, golang build tensorflow git clone https://github.com/tensorflow/tensorflow sudo pacman -S bazel sudo pacman -S python-numpy docker run -it -p 8888:8888 gcr.io/tensorflow/tensorflow docker run -it gcr.io/tensorflow/tensorflow bash https://www.tensorflow.org/install/install_linux#InstallingDocker https://www.tensorflow.org/get_started/get_started

2017-04-04 · 1 min · 29 words · -

Guava cache

Guava cache http://www.cnblogs.com/peida/p/Guava_Cache.html 缓存,在我们日常开发中是必不可少的一种解决性能问题的方法。简单的说,cache 就是为了提升系统性能而开辟的一块内存空间。 缓存的主要作用是暂时在内存中保存业务系统的数据处理结果,并且等待下次访问使用。在日常开发的很多场合,由于受限于硬盘IO的性能或者我们自身业务系统的数据处理和获取可能非常费时,当我们发现我们的系统这个数据请求量很大的时候,频繁的IO和频繁的逻辑处理会导致硬盘和CPU资源的瓶颈出现。缓存的作用就是将这些来自不易的数据保存在内存中,当有其他线程或者客户端需要查询相同的数据资源时,直接从缓存的内存块中返回数据,这样不但可以提高系统的响应时间,同时也可以节省对这些数据的处理流程的资源消耗,整体上来说,系统性能会有大大的提升。 缓存在很多系统和架构中都用广泛的应用,例如: 1.CPU缓存 2.操作系统缓存 3.本地缓存 4.分布式缓存 5.HTTP缓存 6.数据库缓存 等等,可以说在计算机和网络领域,缓存无处不在。可以这么说,只要有硬件性能不对等,涉及到网络传输的地方都会有缓存的身影。 Guava Cache是一个全内存的本地缓存实现,它提供了线程安全的实现机制。整体上来说Guava cache 是本地缓存的不二之选,简单易用,性能好。 Guava Cache有两种创建方式: cacheLoader callable callback 通过这两种方法创建的cache,和通常用map来缓存的做法比,不同在于,这两种方法都实现了一种逻辑——从缓存中取key X的值,如果该值已经缓存过了,则返回缓存中的值,如果没有缓存过,可以通过某个方法来获取这个值。但不同的在于cacheloader的定义比较宽泛,是针对整个cache定义的,可以认为是统一的根据key值load value的方法。而callable的方式较为灵活,允许你在get的时候指定。 cacheLoader方式实现实例: @Test public void TestLoadingCache() throws Exception{ LoadingCache<String,String> cahceBuilder=CacheBuilder .newBuilder() .build(new CacheLoader<String, String>(){ @Override public String load(String key) throws Exception { String strProValue=“hello “+key+”!”; return strProValue; } }); System.out.println(“jerry value:"+cahceBuilder.apply(“jerry”)); System.out.println(“jerry value:"+cahceBuilder.get(“jerry”)); System.out.println(“peida value:"+cahceBuilder.get(“peida”)); System.out.println(“peida value:"+cahceBuilder.apply(“peida”)); System.out.println(“lisa value:"+cahceBuilder.apply(“lisa”)); cahceBuilder.put(“harry”, “ssdded”); System.out.println(“harry value:"+cahceBuilder.get(“harry”)); } 输出: jerry value:hello jerry! ...

2017-03-31 · 3 min · 467 words · -

Runtime freeMemory,totalMemory,maxMemory

Runtime freeMemory,totalMemory,maxMemory http://blog.csdn.net/zy_27_ok/article/details/8462385 最近在网上看到一些人讨论到Java.lang.Runtime类中的freeMemory(),totalMemory(),maxMemory ()这几个方法的一些题目,很多人感到很迷惑,为什么,在java程序刚刚启动起来的时候freeMemory()这个方法返回的只有一两兆字节,而随着 java程序往前运行,创建了不少的对象,freeMemory()这个方法的返回有时候不但没有减少,反而会增加。这些人对freeMemory()这 个方法的意义应该有一些误解,他们以为这个方法返回的是操纵系统的剩余可用内存,实在根本就不是这样的。这三个方法反映的都是java这个进程的内存情 况,跟操纵系统的内存根本没有关系。下面结合totalMemory(),maxMemory()一起来解释。 maxMemory()这个方法返回的是java虚拟机 (这个进程) 能构从操纵系统那里挖到的最大的内存,以字节为单位,假如在运行java程 序的时 候,没有添加-Xmx参数,那么就是64兆,也就是说maxMemory()返回的大约是64*1024*1024字节,这是java虚拟机默认情况下能 从操纵系统那里挖到的最大的内存。假如添加了-Xmx参数,将以这个参数后面的值为准,例如java -cp ClassPath -Xmx512m ClassName,那么最大内存就是512*1024*0124字节。 totalMemory()这个方法返回的是java虚拟机现在已经从操纵系统那里挖过来的内存大小,也就是java虚拟机这个进程当时所占用的 所有 内存。假如在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的从操纵系统那里挖的,基本上是用多少挖多少,直 挖到maxMemory()为止,所以totalMemory()是慢慢增大的。假如用了-Xms参数,程序在启动的时候就会无条件的从操纵系统中挖- Xms后面定义的内存数,然后在这些内存用的差未几的时候,再往挖。 freeMemory()是什么呢,刚才讲到假如在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的 从操 作系统那里挖的,基本上是用多少挖多少,但是java虚拟机100%的情况下是会稍微多挖一点的,这些挖过来而又没有用上的内存,实际上就是 freeMemory(),所以freeMemory()的值一般情况下都是很小的,但是假如你在运行java程序的时候使用了-Xms,这个时候由于程 序在启动的时候就会无条件的从操纵系统中挖-Xms后面定义的内存数,这个时候,挖过来的内存可能大部分没用上,所以这个时候freeMemory()可 能会有些大。 把下面的源代码编译以后,在class文件所在的目录里面,分别用java -cp . Untitled1 和java -cp . -Xms80m -Xmx80m Untitled1 运行,看看结果如何,有助于理解上面的阐述。 public?class?Untitled1?{?????? ??public?Untitled1()?{}?????? ??public?static?void?main(String[]?args)?{?? ????System.out.println(Runtime.getRuntime().freeMemory());?? ????System.out.println(Runtime.getRuntime().totalMemory());?? ????System.out.println(Runtime.getRuntime().maxMemory());?? ????long?t?=?System.currentTimeMillis();?? ????try?{?? ??????Thread.sleep(30000);?? ????}?catch?(Exception?ee)?{?? ??????ee.printStackTrace();?? ????}?? ????String[]?aaa?=?new?String[2000000];?? ????System.out.println(Runtime.getRuntime().freeMemory());?? ????System.out.println(Runtime.getRuntime().totalMemory());?? ????System.out.println(Runtime.getRuntime().maxMemory());?? ????try?{?? ??????Thread.sleep(30000);?? ????}?catch?(Exception?ee)?{?? ??????ee.printStackTrace();?? ????}?? ????for?(int?i?=?0;?i?<?2000000;?i++)?{?? ??????aaa[i]?=?new?String(“aaa”);?? ????}?? ????System.out.println(Runtime.getRuntime().freeMemory());?? ????System.out.println(Runtime.getRuntime().totalMemory());?? ????System.out.println(Runtime.getRuntime().maxMemory());?? ????try?{?? ??????Thread.sleep(30000);?? ????}?catch?(Exception?ee)?{?? ...

2017-03-31 · 1 min · 74 words · -

jvm thread DestroyJavaVM

jvm thread DestroyJavaVM DestroyJavaVM is a thread that unloads the Java VM on program exit. Most of the time it should be waiting, until apocalypse of your VM. Signal Dispatcher is a thread that handles the native signals sent by the OS to your jvm. Finalizer threads pull objects from the finalization queue and calls it finalize method. Reference Handler is a high-priority thread to enqueue pending References. Its defined in java.lang.ref.References.java This happens because most applications are run in threads. ...

2017-03-30 · 2 min · 272 words · -