生产系统中出现性能问题的原因
1.缺乏本地性能测试
可能有许多可能的性能组合,我们必须使用它们来运行性能测试。例如:
不同的延迟模式,例如网络延迟、第三方响应延迟等。
发送不同类型请求的速率比例不同。某些请求类型可能会给系统带来很大的压力,而且比其他请求类型的压力更大。因此,最好测试生产预测值。
此外,我们的本地测试平台中可能没有生产等效硬件。这可能是一个严重的问题,因为我们可能因此无法进行足够数量的性能测试。因此,当我们没有生产等效硬件时,始终建议测试性能达到某个可接受的水平。
2. 第三方系统可能会出现意外行为
如果我们的系统是一个中间件平台,那么可能有很多第三方系统可以连接到我们的系统。然后,不同的第三方可以有不同的行为方式,因此很难控制。这些行为在早期阶段很难预测。因此,需要监控这些行为,以便我们可以调整我们的系统来克服这些威胁。
3. 意外的网络延迟
网络延迟会对系统性能产生很大影响,因为请求发送线程将被阻塞,直到收到响应。如果这些线程同步等待响应,则网络延迟可能会影响给定时间的空闲线程数。这些网络延迟很难证明,除非在延迟期间进行有效的数据包跟踪
4.缺乏衡量系统性能的日志
如果您没有适当的性能日志,您就不会知道您的系统正在挣扎,除非您的用户抱怨。性能日志的格式将根据系统的工作流程而有所不同。如果系统的响应时间对其用户很重要,则最好添加给定时间段内所花费的平均时间以及其他可测量参数。
如果您的系统严重依赖数据库响应时间或第三方响应时间,最好测量这些延迟并显示平均时间和最大时间值。因此,明智地选择性能日志的格式以适合您的性能指标
5. 数据库系统中的数据增长会减慢系统速度
随着时间的推移,生产系统会将数据积累到数据库中。因此,我们的数据库查询可能会变得更慢,因为它们可能必须处理大量数据。所以,我们必须积累足够的测试数据,并在本地测试性能。
您应该如何解决生产性能问题
1. 确保检查手中所有可能的痕迹
性能日志 - 从性能日志开始,查看在提到的性能问题时间中是否可以看到任何奇怪的迹象。这些性能日志可以给出部分结论。有了这些信息,您可能知道下一步该去哪里调查。但您的性能日志应该足够强大,能够提供足够的详细信息来识别与性能相关的问题。
跟踪日志 - 稍后,您必须在跟踪日志或请求日志中查找匹配信息以识别可能的问题。您应该尝试了解系统在问题期间的行为。如果跟踪日志包含任何意外错误或日志,最好调查它们是否对性能产生任何影响。
数据库慢查询日志——最好检查是否有慢查询。
第三方请求/响应日志 - 分析并查看第三方系统是否存在任何可能导致系统延迟的延迟
2. 进行数据包跟踪
如果您怀疑存在网络延迟,并且在调查时发生性能问题,则最好捕获网络数据包。否则,您可以要求您的系统支持工程师在将来出现性能问题时获取一份。
您的系统日志可能表明请求和响应之间存在很大的延迟。但是您的请求可能会由于系统错误而排队,因此只有一种方法可以确保引入另一个外部工具来捕获网络流量。但是,如果您怀疑网络延迟导致了可能的性能问题,数据包跟踪将帮助您证明其他第三方响应存在延迟。Wireshark 等工具可用于此目的。
3. 进行线程转储
典型的分析工具通常不允许连接到生产系统。此外,即使您很幸运将工具连接到生产系统,它也可能会增加开销并导致您走上错误的道路。您的系统已经在努力获得足够的性能,因此分析可能会使生产系统进一步陷入低迷。因此,线程转储是获取线程当前状态的另一种方法。
线程转储通常是轻量级的,不会对系统性能产生很大影响。多个线程转储可以告诉您线程在生产系统中的使用情况。但这可能并不能始终揭示问题。如果某些东西长时间占用您的线程,则可以在线程转储中看到。但它可能并不总是揭示实际问题。您需要一定的使用线程转储的专业知识,或者您必须使用一个好的工具来读取线程转储。
4.检查GC日志
GC 日志将指示堆内存处理的运行状况。您可以在GC日志中查看内存分配和清理情况,看看您的内存分配是否足够。此外,您还可以确认系统是否存在内存泄漏,这可能会导致实际的性能问题。
5. 如果需要明确的证据来确定情况,请添加更多日志
将日志添加到生产服务器总是很棘手,因为您必须将代码更改应用到当前的生产系统中。所以,这应该是证明某些事情的最后手段,而你没有任何明确的证据。因此,您必须确保您的日志不会影响系统的当前状态,并且它会打印足够的详细信息来证明您的期望,或者至少,它应该为您提供更多详细信息来评估当前问题。只有当您的客户允许您潜入生产系统的补丁时,所有这些事情才有可能实现。
如何解决
找出性能问题的原因后,您可能需要采取有效的措施来解决它。以下是解决该问题的一些典型方法。
1.引入合适的数据库索引来加速查询
您可以为查询选择一个有效的索引,这些索引列在慢查询日志中。请务必检查“查询执行计划”以查看添加的索引是否实际被使用。
2. 缓存重复查询的信息
如果缓存不会对系统的正确性产生很大影响,那么您始终可以使用缓存来获得性能优势。
但这个决定的正确性需要得到适当的验证。
3. 如果当前分配不够,则增加分配的堆内存
如果无法增加内存,您可能需要更改代码以消除任何不必要的内存分配
4. 第三方响应延迟
如果您的第三方请求调用阻塞了您常用的请求处理线程,则第三方响应延迟可能会导致您的系统停顿。
您可能必须重新设计线程以确保外部延迟不会影响系统的运行状况
请求处理线程需要与第三方调用线程分离
我们怎样才能让系统更加可追溯
根据系统的行为,您可以考虑自己的跟踪性能的方法。以下是我建议的一些方法:
1.启用带有人类可读时间的GC日志
您可能需要正确配置 JVM 参数,以便以可读格式打印 GC 日志。
2. 添加有效的性能日志,捕获所有可能的性能参数以适合您的系统
性能日志应该足够短以便于阅读,并且应该足够密集以涵盖所有相关的性能参数,以便进行故障排除
在一行中打印参数总是好的,这样日志就会紧凑并且更容易监控。因此,您可以使用简称。
以下是性能日志的示例,其中包含较短形式的详细信息。该日志将总结特定秒的信息。