问个性能问题,找不到原因
系统分为A和B2个系统,大概架构如下
在系统高峰期,A系统cpu经常90%以上,很容易阻塞(countly本身问题,只能支持这个大的数据),数据库A表锁表经常达到90%,B表锁表只有0.5%-5%之间,mongodb这台服务器cpu通过aws控制台的监控一般只在15-20之间,这个时候(A系统阻塞时)B系统也要发生阻塞,按理说,B系统操作的是B表,为什么这么慢,mongo的日志显示B表操作语句耗时比平时高很多,因此就使B系统阻塞了,B系统jboss只是偶尔报错mongo read timeout错误,没有崩溃只是处理很慢,cup使用率只有10%左右,内存还剩400M左右,另外B系统每分钟大概处理2500-3000
个http请求(200响应)B系统一共有三台服务器,下面是我的mongo配置
<bean id="mongoOptions" class="com.mongodb.MongoOptions"> <property name="autoConnectRetry" value="true" /> <property name="connectionsPerHost" value="500" /> <property name="socketTimeout" value="2000"></property> <property name="connectTimeout" value="2000" /> <property name="maxWaitTime" value="2000" /> </bean>
<Connector protocol="HTTP/1.1" port="8080" address="0.0.0.0" connectionTimeout="20000" redirectPort="8443" maxThreads="800" acceptCount="1400"/>
-server -Xms3000m -Xmx3000m -Xmn1150m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseFastAccessorMethods -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/home/ec2-user/gc.log -XX:+HeapDumpOnOutOfMemoryError -Dorg.jboss.resolver.warning=true -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Djava.net.preferIPv4Stack=true -Djava.endorsed.dirs=/home/ec2-user/jboss-5.1.0.GA/lib/endorsed -classpath /home/ec2-user/jboss-5.1.0.GA/bin/run.jar org.jboss.Main -b 0.0.0.0
下面是操作mongo的java代码
try { DB db = mongoDB.getDb(); DBCollection collection= db.getCollection(Constant.MONGO_DEVICE); DBObject object = collection.findOne(new BasicDBObject("udid", invo.getUdid())); if(object != null){ String t = (String)object.get("token"); if(!t.equals(invo.getPushToken())){ DBObject newObject = new BasicDBObject(); getDeviceDBObject(invo, newObject); collection.update(object, newObject); } }else{ DBObject obj = new BasicDBObject(); getDeviceDBObject(invo, obj); collection.insert(obj,WriteConcern.NONE); } } catch (Exception e) { logger.error("checkudid error!",e); } private void getDeviceDBObject(MessageInVo invo, DBObject newObject) { newObject.put("udid", invo.getUdid()); newObject.put("token", invo.getPushToken()); String appInfo = invo.getAppVersion(); int index = appInfo.indexOf("_"); if(index != -1){ newObject.put("appVersion", appInfo.substring(index+1)); newObject.put("appName", appInfo.substring(0,index)); }else{ newObject.put("appVersion", invo.getAppVersion()); newObject.put("appName", Constant.DEFAULT_APPNAME); } }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
IO不高
回复
看下操作A表的代码在锁那块有没有问题,A,B表有没有联系?
回复
A,B表在2个单独的collection中,没关系,A表操作时node.js,不会,哎,3q
"mongo的日志显示B表操作语句耗时比平时高很多,因此就使B系统阻塞了,B系统jboss只是偶尔报错mongo read timeout错误,没有崩溃只是处理很慢,cup使用率只有10%左右"
感觉像是磁盘IO高了