最近在开发一个消息中间件,使用了hbase作为存储引擎。今天在进行性能测试的时候发现一个极其诡异的现象:client向我们server拿数据的时候,server网卡的进出流量极其不均,进来的流量居然跑满了网卡,出去才30M左右(server进来的流量是从hbase scan数据,出去的流量是server将从hbase scan的数据发送给client)。按道理来说,进出的流量应该是1:1的才对,为什么出现这种奇怪的流量差呢?
经过反复的调试,反复的review代码,我把注意力集中到了hbase Scanner对象的setCaching()这个方法上。每次client请求数据时,我都调用了此方法setCaching(1000),而client实际只要了100行。setCaching(1000)的意思就是从hbase server一次抓取1000行数据到我们的server上,然后scan出前100行,发送给client。这就可以清楚的看到server进来的数据量是出去的10倍。也就可以解释奇怪的流量差了。哈哈。最后的解决方案当然是setCaching client实际请求的行数,而不是固定1000行。这样就可以避免网卡资源的浪费了。
接触新东西的时候,一定要认真阅读官方文档,清楚自己的每一个操作都将干什么,这是必须的。