Month: October 2012

有了第4层负载均衡为什么还要做第7层的负载均衡?

有了第4层负载均衡(比如lvs),为什么还要做第7层的(比如nginx, squid)? 第4层负载确实已经能做到比较全面了,但不方便做app-specific的均衡策略。 比如“凡是URL以detail.*开头的请求都导到A1-A10结点”,用lvs等就不方便做。然而,用nginx等就比较好实现。  也就是说 第7层负载可以实现更加灵活的、与应用层信息相关的均衡策略。

CPU的us和sy高对于JAVA应用来说分别意味着什么?

以下内容来自林昊的《分布式JAVA应用》 us高代表用户态程序占CPU的比例较高 sy高代表内核态程序占CPU的比例较高 对java应用来说, us高一般是因为    1. 有些线程一直处于可运行状态,比如使劲循环    2. CPU密集型操作太多,比如正则运算    3. 频繁GC sy高一般是因为线程上下文切换过于频繁。而切换过多,一般是由于过多阻塞导致的,包括锁等待、I/O阻塞等,一个线程的阻塞会导致CPU让另一个线程上位,即上下文切换。 p.s. sy高跟系统调用过多也会有关系

哈希表里的bucket是指什么东西?

转自维基百科: http://en.wikipedia.org/wiki/Hash_function In general, a hashing function may map several different keys to the same index. Therefore, each slot of a hash table is associated with (implicitly or explicitly) a set of records, rather than a single record. For this reason, each slot of a hash table is often called a bucket, and hash values …

哈希表里的bucket是指什么东西? Read More »

既有 Non-Blocking I/O,为什么还要Readiness Selection ?

Non-Blocking I/O已经可以做到不阻塞、不会导致线程发呆了,为什么还要Readiness Selection?  是因为Non-Blocking I/O仍需要轮询吗?虽然Readiness Selection号称属于系统通知机制,但我们在写代码时还是得通过select()来查看有没有通知,本质上其实还是轮询。 那Readiness Selection倒底有没有好处?  我试着回答一下:   1. 轮询的对象不一样,代价也不一样。 Non-Blocking I/O下,线程需要逐个查看各个Channel;而在Readiness Selection时,线程只需要查看单个selector下有没有事件发生。前一种轮询可能会导致多个system call, 而后一种不会。在后一种情况下,OS高效地帮你做了很多事情,直接利用OS提供的功能,总体代价要小得多。   2. Non-Blocking I/O时,发现有数据后必须马上读数据,而Readiness Selection中,可以选择先放一下. 有时候你的应用的性能可能取决于你有没有“先放一下”的自由,比如说,当前CPU Load太高了,可以先不分配线程来读数据,等系统较空闲时再去处理。

BTrace如何只查探特定对象的方法

BTrace源码的查探点一般是类级别的,指定类名后,这个设置将对此类的所有对象都生效。 但有时我们只想监控这个类里的某个对象,比如某个业务类中的某个HashSet类型的成员变量。  BTrace对此没有直接的支持,但有的情况下你可以考虑一种变通的方法:   1. 先写一个BTrace源码找到你要访问的特定对象的hashCode.         int hashCode = BTraceUtils.identityHashCode(set)   2. 然后另写BTrace源码,按hashCode过滤对象: @OnMethod(clazz="java.util.HashSet", method="/.*/") public static void allListMethodsEntry(@Self java.util.HashSet set) throws Exception { if(identityHashCode(set) == hashCode ) { … } } 不得不承认,这种办法的适用场景非常有限:    你的目标应该是一个长寿对象(比如系统中的单例),这个对象的hashCode一直不变。

access$000() 方法是什么方法?

access$000() (或access$100等) 方法代表外部类直接访问内部类的私有变量,或者内部类直接访问外部类的私有变量。 要找出具体访问哪个了变量,可以用javap看一下字节码,如: 引用 static java.lang.String access$000(my.OuterClass$InnerClass);   Code:    Stack=1, Locals=1, Args_size=1    0:   aload_0    1:   getfield        #3; //Field someField:Ljava/lang/String;    4:   areturn   LineNumberTable:    line 391: 0