开始进行服务器调优,记录一下过程

开始进行服务器调优,记录一下过程,以便以后参考

1、服务器512M内存。mysql本地,日志rsyslog输出至远程。

2、直接往服务器发送10000个注册用户的请求,单socket,发送用了80毫秒,服务器处理完消耗89秒。

2.1) 关闭log后只需要27秒。但因为平时要使用log进行记录,不应该关闭log

2.2) 使用@Async标签,将db操作设置为异步,在dao上设置的@Async,未生效,处理时间还是一样长。

2.2) 1万个帐号注册只需要1分半,已经可以接受了。

3、测试1万帐号同时登陆。

3.1)需要同时开启10000个runnable,先试下同时开10000个socket的速度

3.2) 同时开始10000个socket,感觉速度还可以接受。

3.3)直接无限向服务器发送包,直接达到积累至几百万的消息包,先暂停优化。

3.3.1) 关闭log后,处理速度提升了两个数量级,发ping包,可以一次处理几十万也不会产生积累。但我写的机器人却卡死了,出现: GC overhead limit exceeded。jdk中自带的jvisualvm是个好东西。查找一下是哪里导致的挂掉。

3.4) 10000帐号同时并发登陆,好吧,直接卡死了。明天来解决。

3.5) 慢,非常慢。很耗时。

3.6) 猜测是否因为db读取慢的原因。测试db读取随机1万帐号只需要16秒。不是db读取的问题。

3.7) 打开日志,查看日志,发现一个现象:log处理中出现5秒的空白间隔,没有处理任何消息,经常出现。

3.8) 查找代码:

((InetSocketAddress) context.channel().remoteAddress()).getHostName();

问题出现在这里了,这里是阻塞方法,会去通过dns反查hostname。

修改为如下:

((InetSocketAddress) context.channel().remoteAddress()).getAddress().getHostAddress();

现在1万帐号登陆消耗38秒。

3.9 )  关闭日志后,1万帐号登陆只消耗11秒,已经可以接受了,上面测试的1万db读取需要16秒,这里更快是因为服务器是8线程同时处理登陆。

3.10) 关闭日志后,单socket发送1万帐号注册,处理完成31秒。这里有改进余地。暂时已经可以了。

3.11) 关闭日志后,多线程socket发送1万帐号注册,处理完成30秒。看这里主要是db io在消耗性能。

发表评论?

0 条评论。

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>