问个性能问题,找不到原因

发布于 2021-11-25 18:17:31 字数 3374 浏览 826 评论 4

系统分为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>



下面是我的B系统jboss的配置


<Connector protocol="HTTP/1.1" port="8080" address="0.0.0.0"
  connectionTimeout="20000" redirectPort="8443" maxThreads="800" acceptCount="1400"/>



jboss的jvm参数配置,使用了redis做缓存所以支配了3g内存给jboss使用


-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



求大神帮我分析下B系统性能问题出现在哪里
下面是操作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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

最偏执的依靠 2021-11-28 05:21:28

IO不高

归途 2021-11-27 14:23:23

回复
看下操作A表的代码在锁那块有没有问题,A,B表有没有联系?

拥有 2021-11-26 18:59:30

回复
A,B表在2个单独的collection中,没关系,A表操作时node.js,不会,哎,3q

本宫微胖 2021-11-26 04:12:43

"mongo的日志显示B表操作语句耗时比平时高很多,因此就使B系统阻塞了,B系统jboss只是偶尔报错mongo read timeout错误,没有崩溃只是处理很慢,cup使用率只有10%左右"

感觉像是磁盘IO高了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文