开始进行服务器调优,记录一下过程,以便以后参考
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 条评论。