tomcat + mysql 调优

ladofwind 2015-06-10 02:59:46
1. tomcat 的内存启动配置设置有什么遵循的策略

JAVA_OPTS='-server -Xms10240m -Xmx10240m -XX:PermSize=512M -XX:MaxNewSize=1024m -XX:MaxPermSize=1024m -Djava.awt.headless=true'

我是64位16G内存的linux, 上满配置10G给tomcat用,感觉也不比4G强多少,用top看内存使用一直在3G左右,为什么分配了10G, linux的命令top看还是3G左右呢?

2. 另外我在tomcat中我的应用里设置了mysql连接池初始100个,但是用mysql workbench看mysql的连接数只有20多,按说不是连接池初始100个,有100个连接到mysql server吗?

...全文
261 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ladofwind 2015-06-11
  • 打赏
  • 举报
回复
引用 8 楼 oh_Maxy 的回复:
[quote=引用 4 楼 ladofwind 的回复:] [quote=引用 2 楼 oh_Maxy 的回复:] 我是这么理解的: tomcat配置的内存,只是分配的可用内存,但是不表示这些内存一定马上被用到。咱们top命令看到的java消耗内存,是真实占用的内存。比如当我们的服务生成了一个超大的list,或者其它数据对象,这时候tomcat会尝试分配内存,如果没有超出启动内存,就没问题的,这时候top就可以看到变化了。 数据库的连接池也是差不多的道理。我们可以反向思考,一个数据库的链接是有限的(注意,是数据库服务的链接),如果任意应用配置了一个值,就被占用了,却没有真实使用,这样是很浪费的。只有在应用真的有这么多并发时,才会分配这么多链接。这些链接用完之后,会暂时放到链接池里,当失效时(好像有个链接持有时间或超时时间),就又释放。这个并发的连接数不会超过配置的值。
感谢,这个理解起来就顺了,现在我们服务器早上高并发上来网站无响应,cpu和内存好像都在30%左右,mysql看到连接数也不大,20多30多,现在能想到的就是带宽瓶颈了,不知道这方面调优您有什么建议 [/quote] 正向的方式,可以找一些工具,看看IO和系统负载,还有网络情况,判断是否有短板。 如果闲麻烦,可以考虑用一些笨办法: 1. 每个数据库操作,打印耗时,判断数据库查询是否慢(一般不超过500ms),找到慢SQL(一般在SQL服务器上也能看到慢SQL日志); 2. 使用多线程处理批量操作,看看能否将cpu利用率提高; 3. 如果是网站访问式的,可以看看tomcat 的线程数设置,是否设置小了。 暂时想到这几个。[/quote] 谢谢,升级了带宽,提高了tomcat线程和内存设置,今天早上高峰期平稳度过了,多谢,私信你了微信,可以的话加一个, 互相交流。。。
oh_Maxy 2015-06-11
  • 打赏
  • 举报
回复
引用 4 楼 ladofwind 的回复:
[quote=引用 2 楼 oh_Maxy 的回复:] 我是这么理解的: tomcat配置的内存,只是分配的可用内存,但是不表示这些内存一定马上被用到。咱们top命令看到的java消耗内存,是真实占用的内存。比如当我们的服务生成了一个超大的list,或者其它数据对象,这时候tomcat会尝试分配内存,如果没有超出启动内存,就没问题的,这时候top就可以看到变化了。 数据库的连接池也是差不多的道理。我们可以反向思考,一个数据库的链接是有限的(注意,是数据库服务的链接),如果任意应用配置了一个值,就被占用了,却没有真实使用,这样是很浪费的。只有在应用真的有这么多并发时,才会分配这么多链接。这些链接用完之后,会暂时放到链接池里,当失效时(好像有个链接持有时间或超时时间),就又释放。这个并发的连接数不会超过配置的值。
感谢,这个理解起来就顺了,现在我们服务器早上高并发上来网站无响应,cpu和内存好像都在30%左右,mysql看到连接数也不大,20多30多,现在能想到的就是带宽瓶颈了,不知道这方面调优您有什么建议 [/quote] 正向的方式,可以找一些工具,看看IO和系统负载,还有网络情况,判断是否有短板。 如果闲麻烦,可以考虑用一些笨办法: 1. 每个数据库操作,打印耗时,判断数据库查询是否慢(一般不超过500ms),找到慢SQL(一般在SQL服务器上也能看到慢SQL日志); 2. 使用多线程处理批量操作,看看能否将cpu利用率提高; 3. 如果是网站访问式的,可以看看tomcat 的线程数设置,是否设置小了。 暂时想到这几个。
  • 打赏
  • 举报
回复
引用 2 楼 oh_Maxy 的回复:
我是这么理解的: tomcat配置的内存,只是分配的可用内存,但是不表示这些内存一定马上被用到。咱们top命令看到的java消耗内存,是真实占用的内存。比如当我们的服务生成了一个超大的list,或者其它数据对象,这时候tomcat会尝试分配内存,如果没有超出启动内存,就没问题的,这时候top就可以看到变化了。 数据库的连接池也是差不多的道理。我们可以反向思考,一个数据库的链接是有限的(注意,是数据库服务的链接),如果任意应用配置了一个值,就被占用了,却没有真实使用,这样是很浪费的。只有在应用真的有这么多并发时,才会分配这么多链接。这些链接用完之后,会暂时放到链接池里,当失效时(好像有个链接持有时间或超时时间),就又释放。这个并发的连接数不会超过配置的值。
楼上一看就是有经验的开发人员,楼主可以借鉴一下
rick-he 2015-06-10
  • 打赏
  • 举报
回复
引用 5 楼 ladofwind 的回复:
[quote=引用 3 楼 u011575570 的回复:] [quote=引用 2 楼 oh_Maxy 的回复:] 我是这么理解的: tomcat配置的内存,只是分配的可用内存,但是不表示这些内存一定马上被用到。咱们top命令看到的java消耗内存,是真实占用的内存。比如当我们的服务生成了一个超大的list,或者其它数据对象,这时候tomcat会尝试分配内存,如果没有超出启动内存,就没问题的,这时候top就可以看到变化了。 数据库的连接池也是差不多的道理。我们可以反向思考,一个数据库的链接是有限的(注意,是数据库服务的链接),如果任意应用配置了一个值,就被占用了,却没有真实使用,这样是很浪费的。只有在应用真的有这么多并发时,才会分配这么多链接。这些链接用完之后,会暂时放到链接池里,当失效时(好像有个链接持有时间或超时时间),就又释放。这个并发的连接数不会超过配置的值。
同意楼上的,楼主可以用free -m查看下内存使用情况, 数据库的初始化连接池你可以将配置发出来看下吗?[/quote] <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="initialSize" value="100"/> <property name="maxActive" value="200" /> <property name="timeBetweenEvictionRunsMillis" value="3600000" /> <property name="minEvictableIdleTimeMillis" value="3600000" /> </bean>[/quote] 我是这样配置的 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="jdbcUrl" value="${db.url}"></property> <property name="driverClass" value="${db.driverClassName}"></property> <property name="user" value="${db.username}"></property> <property name="password" value="${db.password}"></property> <property name="maxPoolSize" value="150"></property> <property name="minPoolSize" value="1"></property> <property name="initialPoolSize" value="1"></property> <property name="maxIdleTime" value="20"></property> </bean> 你查下数据库的最大连接数show variables like 'max_connections';发出来看下
ladofwind 2015-06-10
  • 打赏
  • 举报
回复
引用 3 楼 u011575570 的回复:
[quote=引用 2 楼 oh_Maxy 的回复:] 我是这么理解的: tomcat配置的内存,只是分配的可用内存,但是不表示这些内存一定马上被用到。咱们top命令看到的java消耗内存,是真实占用的内存。比如当我们的服务生成了一个超大的list,或者其它数据对象,这时候tomcat会尝试分配内存,如果没有超出启动内存,就没问题的,这时候top就可以看到变化了。 数据库的连接池也是差不多的道理。我们可以反向思考,一个数据库的链接是有限的(注意,是数据库服务的链接),如果任意应用配置了一个值,就被占用了,却没有真实使用,这样是很浪费的。只有在应用真的有这么多并发时,才会分配这么多链接。这些链接用完之后,会暂时放到链接池里,当失效时(好像有个链接持有时间或超时时间),就又释放。这个并发的连接数不会超过配置的值。
同意楼上的,楼主可以用free -m查看下内存使用情况, 数据库的初始化连接池你可以将配置发出来看下吗?[/quote] <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="initialSize" value="100"/> <property name="maxActive" value="200" /> <property name="timeBetweenEvictionRunsMillis" value="3600000" /> <property name="minEvictableIdleTimeMillis" value="3600000" /> </bean>
ladofwind 2015-06-10
  • 打赏
  • 举报
回复
引用 2 楼 oh_Maxy 的回复:
我是这么理解的: tomcat配置的内存,只是分配的可用内存,但是不表示这些内存一定马上被用到。咱们top命令看到的java消耗内存,是真实占用的内存。比如当我们的服务生成了一个超大的list,或者其它数据对象,这时候tomcat会尝试分配内存,如果没有超出启动内存,就没问题的,这时候top就可以看到变化了。 数据库的连接池也是差不多的道理。我们可以反向思考,一个数据库的链接是有限的(注意,是数据库服务的链接),如果任意应用配置了一个值,就被占用了,却没有真实使用,这样是很浪费的。只有在应用真的有这么多并发时,才会分配这么多链接。这些链接用完之后,会暂时放到链接池里,当失效时(好像有个链接持有时间或超时时间),就又释放。这个并发的连接数不会超过配置的值。
感谢,这个理解起来就顺了,现在我们服务器早上高并发上来网站无响应,cpu和内存好像都在30%左右,mysql看到连接数也不大,20多30多,现在能想到的就是带宽瓶颈了,不知道这方面调优您有什么建议
rick-he 2015-06-10
  • 打赏
  • 举报
回复
引用 2 楼 oh_Maxy 的回复:
我是这么理解的: tomcat配置的内存,只是分配的可用内存,但是不表示这些内存一定马上被用到。咱们top命令看到的java消耗内存,是真实占用的内存。比如当我们的服务生成了一个超大的list,或者其它数据对象,这时候tomcat会尝试分配内存,如果没有超出启动内存,就没问题的,这时候top就可以看到变化了。 数据库的连接池也是差不多的道理。我们可以反向思考,一个数据库的链接是有限的(注意,是数据库服务的链接),如果任意应用配置了一个值,就被占用了,却没有真实使用,这样是很浪费的。只有在应用真的有这么多并发时,才会分配这么多链接。这些链接用完之后,会暂时放到链接池里,当失效时(好像有个链接持有时间或超时时间),就又释放。这个并发的连接数不会超过配置的值。
同意楼上的,楼主可以用free -m查看下内存使用情况, 数据库的初始化连接池你可以将配置发出来看下吗?
oh_Maxy 2015-06-10
  • 打赏
  • 举报
回复
我是这么理解的: tomcat配置的内存,只是分配的可用内存,但是不表示这些内存一定马上被用到。咱们top命令看到的java消耗内存,是真实占用的内存。比如当我们的服务生成了一个超大的list,或者其它数据对象,这时候tomcat会尝试分配内存,如果没有超出启动内存,就没问题的,这时候top就可以看到变化了。 数据库的连接池也是差不多的道理。我们可以反向思考,一个数据库的链接是有限的(注意,是数据库服务的链接),如果任意应用配置了一个值,就被占用了,却没有真实使用,这样是很浪费的。只有在应用真的有这么多并发时,才会分配这么多链接。这些链接用完之后,会暂时放到链接池里,当失效时(好像有个链接持有时间或超时时间),就又释放。这个并发的连接数不会超过配置的值。
ladofwind 2015-06-10
  • 打赏
  • 举报
回复
求大神指导啊

67,511

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧