性能优化
文章平均质量分 85
以实战经验分享性能优化心得体会。
Defonds
Arcsoft云服务部门视频流服务产品技术经理。多年一线Java Web开发经历,专注高性能Web服务、Web项目架构设计。熟悉权限设计、服务集群、安全防御、设计模式、多线程并发编程、JVM内存管理、项目管理等Web开发所涉及领域以及各种开源Web开源框架,还做过一年JavaMobile开发,熟悉多个J2ME开源框架
展开
-
由 ObjectInputStream 所引起的 Java 内存泄漏问题
Java 的 ObjectInputStream 和 ObjectInputStream 各自保留一个对已发送/已接收对象的引用的列表。就是这些引用,会阻止垃圾收集器对这些对象内存的释放。当新对象的数量不断增长时(比方说在服务器中),最终将抛出"Java.lang.OutOfMemoryError"。解决办法就是使用 writeUnshared() 和 readUnshared() 方法来取代 writeObject() 和 readObject() 方法。介绍怎样在 Java 中创建一个内存泄漏?这翻译 2020-12-04 19:00:37 · 1448 阅读 · 9 评论 -
警惕 Oracle 索引优化时陷阱之无效的索引范围扫描(INDEX RANGE SCAN)导致的全表扫描
生产环境慢查询统计中,发现表 STATUS 的 MILESTONE 字段条件查询时进行了全表扫描。表 STATUS 的 MILESTONE 字段定义如下:针对上述问题创建索引:create index STATUS_MILESTONE on STATUS("MILESTONE") tablespace DFS_INDEX2;分析执行计划发现问题语句依然走的是全表扫描,新建的索引 STATUS_MILESTONE 没有用到。第一反应是索引是不是没有创建成功?查看索引库发现该索引确实存在并且生效:原创 2020-07-06 20:29:10 · 2856 阅读 · 0 评论 -
关于 JVM 的线程 Dump 文件的提取
线程 DUMP 是用以分析服务器 / JVM 挂起以及定位其原因最重要的 JVM 报告之一…本文介绍几种收集线程 DUMP 的常见技巧…注意:仅仅收集 JVM 中一两个线程的 DUMP 并没有太大用处。所以最好是在 10 - 12 秒内最少收集到 5 - 6 个线程栈快照…选项一。Windows 下:在服务运行的命令窗口下同时按 Ctrl + Break。Solaris/Linux 等 Un...翻译 2020-02-15 19:07:02 · 1267 阅读 · 0 评论 -
服务器挂起的原因以及需要如何应对?
文章目录服务器挂起是什么情况,它有哪有症状?Weblogic 线程的角色和职责?什么是 Execute 队列?服务器挂起可能会有哪些原因?如果出现服务器挂起或响应缓慢的情形,服务端的日志是什么样子的?服务器端出现上述这种日志是不是就意味着 Weblogic 已经挂起?收集调试数据需要哪些应急步骤?作者简介线程 dump 分析是找出服务器响应缓慢、服务器挂起、粘滞线程导致服务器崩溃等问题原因的最重...翻译 2020-01-06 21:51:01 · 4709 阅读 · 1 评论 -
Java 应用中高 CPU 利用率问题的定位
1. Java 应用中 CPU 峰值故障的排查Java 应用高 CPU 利用率可能与以下几种原因有关:垃圾收集执行 Full GC 过于频繁,但由于 servlet 容器内应用里的一个内存泄漏问题,或者 servlet 容器自身的内存泄漏问题,导致每次 Full GC 无法释放很多内存出来。由于应用需要更多内存所以垃圾回收器经常执行 Full GC (类似于前面一点所述,但可能没有内存泄漏,...翻译 2019-12-17 20:20:41 · 790 阅读 · 0 评论 -
Eureka 的 Application Service 客户端的注册以及运行示例
Eureka 服务器架起来了(关于架设步骤参考博客《Linux 下 Eureka 服务器的部署》),现在如何把我们要负载均衡的服务器(也就是从 Application Client 接收请求并返回一个响应的 Application Service)注册到 Eureka?本文以一个示例介绍 Eureka Application Service 客户端的 Eureka 生命周期(包括启动时的注册、侍服示例、关闭时的取消注册)情况,相信读完本文之后,读者可以对 Eureka 的 Application Servi原创 2014-07-09 09:44:41 · 93644 阅读 · 6 评论 -
B-Tree 索引和 Hash 索引的对比
对于 B-tree 和 hash 数据结构的理解能够有助于预测不同存储引擎下使用不同索引的查询性能的差异,尤其是那些允许你选择 B-tree 或者 hash 索引的内存存储引擎。B-Tree 索引的特点B-tree 索引可以用于使用 =, >, >=, SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';SELECT * FROM tbl_n翻译 2015-07-06 21:14:49 · 15744 阅读 · 1 评论 -
学会读懂 MySql 的慢查询日志
在前边的博客《何时、如何开启 MySql 日志?》中,我们了解到了如何启用 MySql 的慢查询日志。今天我们来看一下如何去读懂这些慢查询日志。在跟踪慢查询日志之前,首先你得保证最少发生过一次慢查询。如果你没有可以自己制造一个:root@server# mysql -e 'SELECT SLEEP(8);上述操作所做的事情只有一个:"睡"(啥也不做)八秒。这个长度应该足以被记录在你的慢查询日志里了翻译 2015-07-14 15:21:55 · 4440 阅读 · 0 评论 -
JMeter 压力测试使用函数和 CSV 文件参数化 json 数据
在 http Load Testing 中,json 数据的提交是个让人头疼的问题。本文详细介绍如何进行 JMeter 的 json 测试提交,以及如何将其参数化。 Step 1 http json 请求采样器的录制 这个工具很多,可以使用 JMeter 代理录制,也可以使用 Badboy。该采样器录制好以后如下图所示: Step 2 为该采样器添加 HT原创 2014-11-05 15:26:13 · 59896 阅读 · 6 评论 -
JMeter 源码解析之一:JMeter 上传文件时,如何参数化 Content-Disposition 的 filename?
问题描述 文件上传时,用户定义 Content-Disposition 是失效的。 笔者在写压力测试脚本的时候,有个上传页面,服务器是根据用户传过来的 Content-Disposition 里的 filename 值来定义保存文件的文件名的。但是测试人员不可能为每一次请求都准备一个不同的文件(这个工作量海了去了),所以 JMeter 传给服务器的 Content-Di原创 2014-11-29 09:44:31 · 66000 阅读 · 4 评论 -
JMeter 服务器性能监测插件介绍
简介压力测试过程中,随时对负载服务器的健康状况的把控是相当重要的,有了这些数据,我们才能准确分析出压测瓶颈。如果你面对的是一个集群,如果能了解到负载是否被正确分发,是不是一件很漂亮的事情?为了达到这些目的,JMeter 插件包现在能够支持服务器监控啦!使用这个插件,你几乎可以在所有平台上监对 CPU、内存、Swap、磁盘 I/O、网络 I/O 进行监控!以下监控插件图演示了压力测试中的 4 台服务翻译 2014-12-01 18:49:42 · 35764 阅读 · 5 评论 -
深入理解开源数据库中间件 Vitess:核心特性以及如何进行数据存储的堆叠
Vitess 是一个用于 MySql 扩展的数据库解决方案。它以能够像运行在专用硬件上那样有效地运行在云体系为目标进行架构。它集 MySql 数据库的很多重要特性和 NoSQL 数据库的可扩展性于一体。Vitess 已经成功侍服了 2011 年以来所有的 YouTube 数据库流量。翻译 2015-08-20 19:27:52 · 17165 阅读 · 0 评论 -
JMeter 如何把上一个请求的结果作为下一个请求的参数 —— 使用正则提取器
有这样一个压力测试环境,有一个上传页面,上传成功之后服务器会返回一些上传信息(比如文件的 id 或者保存路径之类的信息),然后压力机会继续下一个请求,比如调整 id 为 xx 的文件的一些信息等等。问题来了:JMeter 是不知道上传后文件的 id 的,第二个请求势必从第一个请求的返回结果中提取出文件 id,然后依此为参数发起第二次请求。那么 JMeter 如何把上一个请求的结果作为下一个请求的参数呢?本文将介绍如何使用正则提取器解决这个问题。原创 2014-11-25 09:25:38 · 54463 阅读 · 6 评论 -
MySql 存储引擎的选取
存储引擎是为不同的表类型处理 SQL 操作的 MySql 组件。InnoDB 是默认的、最通用的存储引擎,也是官方推荐使用的存储引擎,除非一些特定案例。MySql 5.6 中的 CREATE TABLE 语句创建的表的存储引擎默认就是 InnoDB。MySql 服务器使用的是一个可插拔存储引擎架构,它能够在运行的时候动态加载或者卸载这些存储引擎。可以使用 SHOW ENGINES 语句来查看你的翻译 2015-07-08 21:37:20 · 4686 阅读 · 0 评论 -
何时、如何开启 MySql 日志?
假如你是一名 web 开发人员,如果你想调试你的应用或提升其性能的话,那你需要去参考各种日志文件。日志是开始故障排除最好的选择。就著名的 MySql 数据库服务器而言,你需要参考以下日志文件:错误日志:它包含了服务器运行时(当然也包括服务启动和停止时)所发生的错误信息普通查询日志:这是一个记录 mysqld 在做什么(连接,断开,查询)的通用日志慢查询日志:正如其名,它记录了 "慢" 的查询 SQ翻译 2015-07-13 10:24:02 · 11644 阅读 · 1 评论 -
警惕 MySql 更新 sql 的 WHERE 从句中的 IN() 子查询时出现的性能陷阱
mer_stage 表有 216423 条记录,DDL:CREATE TABLE `mer_stage` ( `STAGE_ID` int(11) NOT NULL AUTO_INCREMENT, `MER_ID` int(11) NOT NULL, `MER_CODE` varchar(16) DEFAULT NULL, `MER_NAME` varchar(80) NOT NU原创 2015-07-03 19:55:53 · 38552 阅读 · 5 评论 -
注意使用 BTREE 复合索引各字段的 ASC/DESC 以优化 order by 查询效率
tbl_direct_pos_201506 表有 190 万数据,DDL:CREATE TABLE `tbl_direct_pos_201506` ( `acq_ins_code` char(13) NOT NULL DEFAULT '' COMMENT '机构代码', `trace_num` char(6) NOT NULL DEFAULT '' COMMENT '跟踪号', `tr原创 2015-07-02 16:03:57 · 6194 阅读 · 0 评论 -
Ribbon 和 wowza 的集成开发
Ribbon 是提供 REST 服务的区域感知负载均衡器,它在 wowza 的前端,应该部署在专业的 REST 容器下,而不是流媒体服务器 wowza 下。本文介绍了 Ribbon 和 wowza 的集成,Ribbon 作为 wowza 的一个插件部署在了 wowza 容器下,仅供 Ribbon 开发、部署的技术参考,现实中绝不可能出现这种情况,因为 Wowza 毕竟不是专业提供 REST 服务的容器。关于 Ribbon 和 Wowza 真实场景的架构部署,请关注作者后续博客。原创 2014-06-20 13:41:46 · 5992 阅读 · 1 评论 -
设计模式实战应用之五:工厂方法模式
工厂方法模式的应用相当广泛。工厂方法模式在 Java API 中的应用比比皆是:java.util.Collection 接口的 iterator 方法就是一个很著名的抽象工厂方法的示例;java.net.URLStreamHandlerFactory 的 createURLStreamHandler(String protocol) 也是工厂方法模式的一个很经典的应用,URLStreamHandlerFactory 定义了一个用来创建 URLStreamHandler 实例的 createURLStre原创 2014-07-30 18:23:37 · 6285 阅读 · 3 评论 -
Linux 性能分析工具 nmon for Linux
nmon 是 Nigel's performance Monitor for Linux on POWER, x86, x86_64, Mainframe & now ARM (Raspberry Pi) 的缩写,意思是 Nigel(nmon 的作者是 Nigel Griffiths) 的 Linux 性能检测器。这一系统管理员、调谐器、基准测试工具将提供给你大量重要的性能信息。它可以有两种方式输翻译 2014-12-04 16:39:48 · 24473 阅读 · 0 评论 -
关于 Tomcat 的线程池的理解
默认配置下,Tomcat 会为每个连接器创建一个绑定的线程池(最大线程数 200)。在大多数情况下你不需要改这个配置(除非增大最大线程数以满足高负载需要)。但是 Tomcat 喜欢在每个工作者线程的 thread-local 上下文缓存一些诸如 PageContext 以及标签缓存的对象。正因如此,就会有你期望 Tomcat 能够将线程关掉以清理出来一些内存的情况。此外,每个连接器维护自己的线程池翻译 2015-02-11 16:33:27 · 6187 阅读 · 1 评论 -
使用 Java 执行器实现线程池
在做一个 JSR 315 - servlet 规范 3.0 的报告时,我意识到理解异步 servlet 的一个关键点在于首先要理解 Java 中的异步处理机制。有因有果,很快我陷入了执行器(Executor)和执行器服务(ExecutorService)之中 - 因为它们是 Java 的异步处理的关键构件。在本博客中我将就这一主题我对掌握到的东西做一个总结。几个概念任务:定义为一个小的独立的活动,翻译 2015-02-12 16:53:04 · 3120 阅读 · 0 评论 -
如何决定 Web 应用的线程池大小
在部署 web 应用到生产环境,或者在对 web 应用进行性能测试的时候,经常会有人问:如何决定 web 应用线程池大小?决定一个 IO 阻塞型 web 应用的线程池大小是一项很艰巨的任务。通常是通过进行大量的性能测试来完成。在一个 web 应用中同时拥有多个线程池会让决定最优线程池大小的过程变得更加复杂。本文将就这个常见的问题进行一些讨论和建议。线程池web 应用中的线程池大小决定了在指定时间内翻译 2015-02-15 15:14:54 · 6029 阅读 · 1 评论 -
Java 理论和实践:线程池和工作队列
使用线程池以获取最佳资源利用率Java 多线程编程论坛中最常见的一个问题就是各种版本的 "我怎么样才可以创建一个线程池?" 几乎在每个服务器应用里,都会出现关于线程池和工作队列的问题。本文中,Brian Goetz 就线程池原理、基本实现和调优技术、需要避开的一些常见误区等方面进行共享。为何要用线程池?有很多服务器应用,比如 Web 服务器,数据库服务器,文件服务器,或者邮件服务器,都会面对处理大翻译 2015-02-13 19:08:08 · 6518 阅读 · 0 评论 -
Java 自带性能监控工具:监视和管理控制台 jconsole 的使用
想验证你对 jvm 配的一些调优参数有没有起作用吗?想不想实时监控你自定义的线程池的在实际运行时的线程个数、有没有死锁?想不想实时监控你的 Java 应用的堆内存使用情况,并根据峰值等数据设置最适合你的 Xms、Xmx 等参数?想不想找到你的应用的永久区 PermGen 的使用峰值,并根据其去设置合理的 XX:PermSize、XX:MaxPermSize 等参数?如何根据应用实时的运行运行情况合理配置年轻代(Young Generation,即 Eden 区和两个 Survivor 区之和)和年老代(Ol原创 2015-04-15 20:45:28 · 40119 阅读 · 5 评论 -
MyISAM 和 InnoDB 中索引使用的区别
两个小型表 item、category:CREATE TABLE `item` ( `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(150) NOT NULL, `category_id` mediumint(8) unsigned NOT NULL, PRIMARY KEY (`id`),翻译 2015-07-02 20:53:59 · 3235 阅读 · 1 评论 -
开源数据库中间件 Vitess:一组旨在使 web 应用的 MySql 数据库的水平扩展简单化的服务器和工具集
Vitess 是一个用于对 MySql 进行水平扩展的存储平台。经过优化,它可以像在专用硬件上那样有效地运行在云架构。它集 MySql 数据库的很多重要特性和 NoSQL 数据库的可扩展性于一体。翻译 2015-08-19 17:07:38 · 4836 阅读 · 1 评论 -
mongoDB 性能优化:如何使用普通查询语句替代 aggregate 操作?
我们知道,mongo 里的普通查询语句是没有分组查询功能的,如果要实现类似于关系型数据库 SQL 里的 group by 操作就要用 aggregate。遗憾的是副本集中,aggregate 操作是在主库执行(比如笔者的 3.0.3 就是这样的,据说 mongo 新版本会改善这一状况 - 将 aggregate 操作放到从库执行),这对于读写分离的副本集是不合理的,大并发时的大量慢查询操作很容易将原创 2016-04-09 11:21:41 · 10326 阅读 · 0 评论 -
如何使用 JMeter 调用你的 Restful Web Service?进行简单的压力测试和自动化测试
表述性状态传输(REST)作为对基于 SOAP 和 Web 服务描述语言(WSDL)的 Web 服务的简单替代,在 Web 开发上得到了广泛的接受。能够充分证明这点的是主流 Web 2.0 服务提供商在接口设计中对 REST 的普遍采用 - 包括雅虎、谷歌以及脸谱 - 出于简单易用、以面向资源的模型发布自己的服务的偏好他们都已经抛弃了 SOAP 和基于 WSDL 的接口。在你必须要对你的 REST翻译 2017-01-22 09:20:27 · 13509 阅读 · 1 评论 -
又一例 select for update 的悲观锁使用所引发的血案
1. 事故描述昨日上午十点多,我们的基础应用发生生产事故。具体表象为系统出现假死无响应。2. 硬件 LB查看硬件负载路由情况:ARRAY-3(config)#sh stati sl r tcp JiChuYinYong_a_8001Real service JiChuYinYong_a_8001 192.168.1.137 8001 UP ACTIVE Main health che原创 2017-03-26 18:20:05 · 24415 阅读 · 3 评论 -
某次压测时物理内存被用光 Tomcat 被 Kernel kill 掉的案例
在对某项目进行压测时,阿里云 PTS 压测工具监测到在某个时间点后 tps 呈下降趋势:作为对应指标的响应时间(rt)在这个时间点呈上升趋势:查看实时监控-监控集指标,发现 publisher1 节点的 CPU 利用率已降为 1.9,在高并发的时候这个值肯定是有问题,很可能这个节点已经宕掉:查看网络流量发现该节点果然已经没有了网络流量:ssh 登录 publisher1 ps 证实 Tomcat原创 2017-07-25 15:09:26 · 13523 阅读 · 1 评论 -
Linux 如何添加一个 Swap 文件
我需要添加额外的 swap 空间以提升我的 Linux 服务器/桌面系统的性能。我该如何在不创建一个新的分区的前提下只使用命令行就添加一个 swap 文件到 Linux 系统中去呢?在 Linux 中,亦如在大多数其它的类 Unix 操作系统中,通常都使用一块磁盘的一整块分区来作为交换区域。但对于 2.6 Linux Kernel 交换文件能够和交换分区一样快 - 尽管我还是建议去使用一个交换分区翻译 2017-08-14 17:04:21 · 9505 阅读 · 1 评论 -
一次应用访问数据库 IP 配成外网 IP 引发的血案
我们生产的渠道对接系统出现大量推送运营商信息失败的现象。问题最终定位到 mongo 身上:.00:03:05.425 [http-nio-9100-exec-53] ERROR c.d.r.s.i.CarrierOpRepServiceImpl - 存储运营商数据失败,Timeout waiting for a pooled item after 120000 MILLISECONDS; ne...原创 2017-11-04 20:18:27 · 8377 阅读 · 0 评论 -
Redis 缓存 + Spring 的集成示例
《整合 spring 4(包括mvc、context、orm) + mybatis 3 示例》一文简要介绍了最新版本的 Spring MVC、IOC、MyBatis ORM 三者的整合以及声明式事务处理。现在我们需要把缓存也整合进来,缓存我们选用的是 Redis,本文将在该文示例基础上介绍 Redis 缓存 + Spring 的集成。关于 Redis 服务器的搭建请参考博客《Redhat5.8 环原创 2015-09-24 19:53:26 · 182579 阅读 · 70 评论 -
Weblogic 服务器不自动清理 ThreadLocal 对象导致内存泄漏问题的解决方案
最近更新于 2018-11-13。适用于Oracle Weblogic 服务器 - 版本 10.3.5 及以后。本文信息适用于任何平台。问题在一个线程执行结束以后,Weblogic 服务器并不会清理设置在 ThreadLocal 里的对象。这会导致内存泄漏。使用 Eclipse 内存分析工具 MAT (Memory Analysis Tool) 跟踪的一个内存泄漏的例子:右击内存泄...翻译 2019-01-02 14:35:09 · 2525 阅读 · 0 评论 -
Apache HttpClient 与 SSL 代理
有这样一个场景,出于安全的考虑,某些操作敏感数据的客户端必须通过 VPN 访问服务器端。这种客户端我们姑且称之为代理访问。访问路由示意图:HTTPS Client <------- Encrypted CONNECT Requests -------> HTTPS Proxy <------- Encrypted CONNECT Requests -------> HT...原创 2019-10-09 22:00:16 · 1636 阅读 · 0 评论 -
警惕 InnoDB 和 MyISAM 创建 Hash 索引陷阱
MySql 常见存储引擎 InnoDB 和 MyISAM 都不支持 Hash 索引,它们默认的索引都是 B-Tree。但是如果你在创建索引的时候定义其类型为 Hash,MySql 并不会报错,而且你通过 SHOW CREATE TABLE 查看该索引也是 Hash。比如表 data_dict 的 DDL:CREATE TABLE `data_dict` ( `data_type` varcha原创 2015-07-07 11:33:35 · 16462 阅读 · 5 评论 -
压力测试随笔之:JMeter,LoadRunner 相得益彰
做压力测试,我喜欢先写 JMeter 脚本,功能测通以后再翻译成 LoadRunner 脚本,最后用 LoadRunner 完成压测。也许我是 Java 出身吧,对 JMeter 总是有一种亲切感用着得心应手,而 LoadRunner 稳定性、强大而友好的结果分析功能又是我无法抗拒的...原创 2017-01-13 10:00:06 · 7269 阅读 · 7 评论 -
MongoDB 性能优化:分析执行计划
前言cursor.explain("executionStats") 和 db.collection.explain("executionStats") 方法提供一个 查询的性能统计情况。这些数据输出在校验某个查询是否以及如何使用了索引的时候非常有用。db.collection.explain() 提供该次执行的一些其他操作信息,比如 db.collection.update()。对于一次查询的性翻译 2016-05-11 20:20:27 · 15264 阅读 · 1 评论 -
Oracle 服务器运行健康状况监控利器 Spotlight on Oracle 的安装与使用
本文是《Linux 服务器运行健康状况监控利器 Spotlight on Unix 的安装与使用》的姊妹篇,Linux 的 Spotlight 监控请参考该篇博客。1.本文背景Oracle 版本:10g Enterprise Edition Release 10.2.0.5.0 - 64bit,部署于 Red Hat 服务器Windows:Win7 旗舰版 sp12.Spotlight on Or原创 2016-10-28 17:52:23 · 19637 阅读 · 3 评论