2016-08-23 45 views
4

我想更好地了解谷歌的云控制台为Stackdriver跟踪显示呼叫详细信息的方式和调试一些性能问题我的应用程序。 大多数请求与内存缓存设下重重的工作/ get操作,我这里有一些问题,但我不明白的是为什么有电话之间的很长一段时间的差距。我已经上传了2张截图。谷歌应用程序引擎 - 云控制台为Stackdriver跟踪细节

call @1025ms call @5235ms

所以,你可以看到,呼叫@ 1025ms了2ms的,但有它和网址抓取电话@ 5235ms之间超过4秒。首先,我的代码在这一点上并不是密集的(并且完整的请求显示了大约9000ms的未交付时间),其次,运行相同代码的大多数类似请求没有这些差距(即,重复请求不具有相同的行为)。但是我也在其他请求上看到了这个问题,我无法复制它们。

请指教!

编辑:

我已经上传从其他的Appstats截图。这是一个“正常”的请求,通常需要几百ms运行(最大1s),并且也在localhost(开发)中。我无法找到任何可以进一步调试的东西。我觉得我缺少一些简单的东西,比如基础层面的东西,关于应用引擎的DO和DO NOT。

appstats

回答

1

鉴于这是很少发生的,实际的处理时间(由跨长表示)很短,我怀疑是某种App Engine的缩放动作在后台发生。例如,减速可能是由于将新实例添加到应用程序中引起的。您可以通过查看App Engine仪表板上的活动图或使用AppStats进一步深入研究(请参阅this SO后)。在跟踪时间轴视图

显示App Engine的事件是什么,我们一直在想了一会儿的事,因为这将极大地缩短了这样情况的分析过程。

+0

我知道,激活将Appstats会对应用程序的性能产生影响,这是也是如此Stakdriver痕迹? –

+0

否 - GAE上的跟踪功能内置于语言运行时,并且不会对您的应用程序产生可观的性能影响。这意味着要按照规模生产,我们只对每个服务收到的请求的一小部分进行抽样。 –

+0

嗨,摩根,我已经激活了appstats,但我似乎无法找到某些东西可以继续工作(我编辑了我的文章)。有任何想法吗? –

1

我知道的这样的间隙的以下常见原因(“untraced时间”):

  • 该请求实际上是在这些间隙期间CPU-约束。

    要检查这个问题,请转到日志查看器 并查看受影响的传入HTTP请求的细节。需要注意的是 这里还有从跟踪的细节到日志 进入一个方便直接的联系。在请求日志条目,查找cpu_ms场,其中规定履行请求所需的

    CPU毫秒。这是CPU实际执行应用程序代码花费的毫秒数,以基准1.2 GHz Intel x86 CPU表示。如果实际使用的CPU速度比基准速度快,则CPU的毫秒数可能会大于实际时钟时间[..]。 (doc)。

    该指标也是protoPayload.megaCycles可用。

    下面是具有大量untraced时间缓慢请求的示例的日志条目:

    2001:... - - [02/Mar/2017:19:20:22 +0100] "GET/HTTP/1.1" 200 660 - "Mozilla/5.0 ..." "example.com" ms=4966 **cpu_ms=11927** cpm_usd=7.376e-8 loading_request=1 instance=... app_engine_release=1.9.48 trace_id=... 
    

    cpu_ms字段是()在这个例子中请求unusally高,表明大部分的untraced的时间花在应用程序本身(或运行时)上。

    为什么请求处理程序使用那么多CPU?通常,几乎不可能精确地确定CPU时间花在哪里,但如果您知道给定请求中应该发生的情况,则可以更轻松地缩小它的范围。两个常见原因是:

    • 这是对新启动的App Engine实例的第一个请求。 JVM需要加载类和JIT编译热门方法 - 预计会显着影响第一个请求(可能还有更多)。请在请求日志条目中查找loading_request = 1,以检查您的请求是否因此而缓慢。考虑Configuring Warmup Requests to Improve Performance

      普罗蒂普,你要专注你的调查筛选出这样的装载请求在日志查看器的情况下,采用这种先进的过滤器:

      protoPayload.megaCycles > 10000 and protoPayload.wasLoadingRequest=false 
      
    • 应用程序代码的某些部分由被大规模放缓过度使用反射。这是特定于App Engine标准环境的,安全管理器限制反射的使用。只有缓解才能减少反思。请注意,App Engine服务基础架构不断发展,所以此提示可能会比以后更早过期。

      如果问题在dev应用程序服务器本地可重现,您可以使用一个分析器(或者可能只是jstack)来缩小它的范围。在其他一些情况下,我实际上必须递增地平分应用程序代码,添加更多日志语句,重新部署等,直到找到有问题的代码。

  • 其实有到未在App Engine环境标准覆盖开箱通过为Stackdriver跟踪后端untraced电话。我目前知道的唯一例子是Cloud SQL。考虑使用Google Cloud Trace for JDBC与Cloud SQL进行交互。

  • 该应用程序是多线程的(很棒!),并且遇到一些自己产生的同步问题。我在野外看到的示例:

    • 特定于应用程序的同步强制对存储后端的所有请求进行序列化(对于给定的App Engine实例)。除了那些神秘的缝隙之外,没有什么东西可以伸出...
    • 应用程序使用数据库连接池。并行请求的数量超过了池的容量(对于给定的App Engine实例),一些请求必须等到连接变为可用时。这是前一项的更复杂的变体。