Monthly Archives: October 2011

常见性能测试指标

常见性能测试指标

  1.Avg Rps和90% Rps

  2.TPS, RPS

  3.Error发生率

  4.Throughput每秒

  5.服务器负载:CPU,MEM,IO,NET

可以重点说下Linux服务器的CPU指标(从某次培训中听来的)

1.CPU的时间分解

  a.用户态占比 

  b.内核态占比

  c.io请求等待时间

  d.cpu空闲占比

2.其它CPU指标

  a.cpu load (线程队列长度)

  b.上下文切换 (I/O容易产生上下文切换,这是因为I/O时容易产生等待,一等待就会CPU就会被其它进程抢占,产生上下文切换)

VIP

转自WIKIPEDIA

virtual IP address (VIP or VIPA) is
an IP address that is not connected to a specific computer or network interface card (NIC) on a computer. Incoming packets are sent to the VIP address, but they are redirected to physical network interfaces.

VIPs are mostly used for connection redundancy; a VIP address may still be available if a computer or NIC fails, because an alternative computer or NIC replies to connections.[1]

收藏一本书: 《分布式Java应用:基础与实践(分布式Java应用知识点全景图)》

作者: 林昊   

目录回到顶部↑

前言 i

第1章 分布式java应用 1

1.1 基于消息方式实现系统间的通信 3

1.1.1 基于java自身技术实现消息方式的系统间通信 3

1.1.2 基于开源框架实现消息方式的系统间通信 10

1.2 基于远程调用方式实现系统间的通信 14

1.2.1 基于java自身技术实现远程调用方式的系统间通信 14

1.2.2 基于开源框架实现远程调用方式的系统间通信 17

第2章 大型分布式java应用与soa 23

2.1 基于sca实现soa平台 26

2.2 基于esb实现soa平台 29

2.3 基于tuscany实现soa平台 30

2.4 基于mule实现soa平台 34

第3章 深入理解jvm 39

3.1 java代码的执行机制 40

3.1.1 java源码编译机制 41

3.1.2 类加载机制 44

3.1.3 类执行机制 49

3.2 jvm内存管理 63

3.2.1 内存空间 63

.3.2.2 内存分配 65

3.2.3 内存回收 66

3.2.4 jvm内存状况查看方法和分析工具 92

3.3 jvm线程资源同步及交互机制 100

3.3.1 线程资源同步机制 100

3.3.2 线程交互机制 104

3.3.3 线程状态及分析 105

第4章 分布式应用与sun jdk类库 111

4.1 集合包 112

4.1.1 arraylist 113

4.1.2 linkedlist 116

4.1.3 vector 117

4.1.4 stack 118

4.1.5 hashset 119

4.1.6 treeset 120

4.1.7 hashmap 120

4.1.8 treemap 123

4.1.9 性能测试 124

4.1.10 小结 138

4.2 并发包(java.util.concurrent) 138

4.2.1 concurrenthashmap 139

4.2.2 copyonwritearraylist 145

4.2.3 copyonwritearrayset 149

4.2.4 arrayblockingqueue 149

4.2.5 atomicinteger 151

4.2.6 threadpoolexecutor 153

4.2.7 executors 157

4.2.8 futuretask 158

4.2.9 semaphore 161

4.2.10 countdownlatch 162

4.2.11 cyclicbarrier 163

4.2.12 reentrantlock 164

4.2.13 condition 164

4.2.14 reentrantreadwritelock 165

4.3 序列化/反序列化 167

4.3.1 序列化 167

4.3.2 反序列化 170

第5章 性能调优 173

5.1 寻找性能瓶颈 175

5.1.1 cpu消耗分析 175

5.1.2 文件io消耗分析 182

5.1.3 网络io消耗分析 186

5.1.4 内存消耗分析 187

5.1.5 程序执行慢原因分析 191

5.2 调优 192

5.2.1 jvm调优 192

5.2.2 程序调优 202

5.2.3 对于资源消耗不多,但程序执行慢的情况 214

第6章 构建高可用的系统 227

6.1 避免系统中出现单点 228

6.1.1 负载均衡技术 228

6.1.2 热备 236

6.2 提高应用自身的可用性 238

6.2.1 尽可能地避免故障 239

6.2.2 及时发现故障 246

6.2.3 及时处理故障 248

6.2.4 访问量及数据量不断上涨的应对策略 249

第7章 构建可伸缩的系统 251

7.1 垂直伸缩 252

7.1.1 支撑高访问量 252

7.1.2 支撑大数据量 254

7.1.3 提升计算能力 254

7.2 水平伸缩 254

7.2.1 支撑高访问量 254

7.2.2 支撑大数据量 264

7.2.3 提升计算能力 266

PreparedStatement: SQL的in字句后面的候选值的个数不定怎么办?

对这样一条SQL:

   sql * from t where c in (?,? …?)

我们希望问号的个数是固定的,这样才能利用SQL预编译缓存,避免硬解析

但如果问号个数就是不固定的怎么办?  

  1.如果问号的最大个数是固定的,则总是使用最大个数的问号;当parameter数小于问号数时,用null补全

    2.如果连最大个数都不是固定的,则要考虑使用数组类型了

框架设计的核心原则之一:indirection

有句话叫做: "All problems in computer science can be solved by another level of indirection"

最近学习了一些框架,很多地方都暗合了这句话。我把我能理解的外延列举一下:

  1.
通过indirection避免diretion所需的复杂性。比如通过操作系统访问硬件比直接机器码操作硬件要简单的多。

  2.
通过抽象的indirection,达到具体实现的多样性以及可插拔性。比如一个DAO可以用hibernate实现,也可以用ibatis实现,上层不必关心。
“抽象化”不限于OO领域,任何有共性的东西都可以抽象成同一种东西,比如,URL/文件路径都可以抽象成“资源”;JVM也是一个著名的例子。

  3.
你表面上在使用一种东西,但在背地里,你的框架却偷偷地通过indirection思想,通过另一种东西来为你服务。这就是“
虚拟化”,它的好处是可以让你用你熟悉的方式去使用服务。举些例子:

      a.你以为你的程序跑在一台普通电脑上,实际上那不过是个VMWare而已

      b.看上去你写的SQL都基于单个数据库,实际上你的DB早就被分库、分表的面目全非了,只不过你的架构师自写了一套jdbc driver,屏蔽了这些复杂性而已。

热部署插件JRebel及其替代品

JRebel可以让你在修改代码后马上看到它的效果,而不需要重启整个应用。

但它不是免费的。所以你会问有没有同类的免费的东西,有人回答说:

I’m one of the JRebel developers and I can assure you that no open source alternatives exist at the moment (you’re free to take this with a grain of salt).

http://stackoverflow.com/questions/1566534/open-source-alternative-to-javarebel

不过,据说这个凑和: 
http://ssw.jku.at/dcevm/

p.s. rebel出了免费社区版了: 
http://zeroturnaround.com/blog/free-version-of-jrebel-social/

java程序的默认Locale如何决定

The default locale of your application is determined in three ways.

First, unless you have explicitly changed the default, the getDefault() method returns the locale that was initially determined by the Java Virtual Machine (JVM) when it first loaded. That is,
the JVM determines the default locale from the host environment. The host environment’s locale is determined by the host operating system and the user preferences established on that system.

Second,
on some Java runtime implementations, the application user can override the host’s default locale by providing this information on the command line by setting the
user.language,
user.country, and
user.variant system properties.