erlang in danger 第五章问题解答

第五章运行时度量

复习题

注意:要实践第五章,需要安装书中推荐的recon库。其中很多的回答,都是使用recon库。

  • 关于 Erlang 的内存,可以报告出哪些类型的信息?

    • 主要考察erlang:memeroy()的返回

      erlang:memory().
      [{total,64454856},
      {processes,15598896},
      {processes_used,15597800},
      {system,48855960},
      {atom,1139889},
      {atom_used,1137782},
      {binary,218312},
      {code,28901739},
      {ets,1015168}]
  • 如果想了解进程的总体情况,可以做的有价值的度量是什么?

  • 什么是端口?如何了解其总的信息?

    • 端口:一种数据类型,涵盖了各种和外部世界通信的连接和socket:TCP socket、UDP socket、SCTP socket、文件描述符


    recon:port_types().
    [{"tcp_inet",50},
    {"efile",5},
    {"2/2",1},
    {"inet_gethost 4 ",1},
    {"tty_sl -c -e",1}]

  • 对于 Erlang 系统,为什么不能用 top 或者 htop 来获取 CPU 的使用率?可用的备选
    方法是什么?

    • 原因:调度器调度和进程实际工作都会消耗cpu资源,导致无法区分是调度工作忙还是进程运行忙。

    • 备选方案:测量wall_clock,调度器钟表时间。


      recon:scheduler_usage(1000)

      这个值是T1/T2,其中
      T1:调度器花在运行进程、常规的 Erlang 代码、NIF、BIF、垃圾回收等上的时间;

      T2:花在空转以及调度进程上的时间;

      显然,wall_clock越大,表示调度器越忙。

      erlang调度器相关

  • 请说出两种可获取到的和进程信号有关的信息?

  • 如何找到进程当前正在运行的代码?

    • recon:info(Pid),返回有current stacktrace项,对应的结果就是。z
  • 对于一个特定进程来说,可以获取到不同种类的内存信息分别是什么?

    • binary: refc binary
    • garbage_collection:
    • heap_size:最新代的堆大小
    • memory
    • message_queue_len
    • messages
    • total_heap_size:包含所有其他部分的堆,包括老堆
  • 如何知道进程工作量的大小?
    recon:info(Pid),找出reduction值

  • 请列举出在生产系统中检查进程时,获取起来不安全的信息。

    • messages
      recon:info(pid(0,1042,0),messages).
      返回进程邮箱中的所有消息。在生产环境中,这个调用是极度危险的,比如,
      如果正在调试某个进程而导致它被锁住,那么其邮箱中会堆积上百万条消息。 一定要先调用 message_queue_len 以确保安全。recon:info(Pid)默认不会返回messages
  • sys 模块中针对 OTP 进程提供了哪些功能?

  • 在检查 inet 端口时,可以得到哪些信息?

    • 元信息
    • 信号
    • IO
    • 内存使用
    • 特定类型
  • 如何得到端口的类型(文件、TCP、UDP)?

    • recon:port_info("#Port<0.818.0>")

开放问题

  • 在进行全局性度量时,为何需要长的时间窗口?
    • 时间窗口会采样两次,如果选用长时间窗口,自然会忽视短生命周期的进程。因为做得是全局性度量,所以需要长生命周期的进程数据
  • 针对如下的每一项,分别说说在需要定位和其相关的问题时,recon:proc_count/2 和
    recon:proc_window/3 哪一个更合适?
    a) reduction
    b) 内存
    c) 消息队列长度
    • reduction,recon:proc_window更适合。因为长期reduction总是累加数值,对于长生命周期的进程,自然数值很大,所以需要指定时间窗口。找出一定时间之内,消耗reduction较大的数值。
    • 内存,recon:proc_count更适合。内存就是本身一个累积量。
    • 消息队列长度,recon:proc_window更适合。可能是一段时间之内,出现消息堆积。此时需要指定时间区间(但是recon:proc_count返回当前的数值,感觉也适合)
  • 如何找到某个给定进程的 supervisor?
    recon:info()中的meta信息中的'$ancestors'
  • 什么情况下使用 recon:inet_count/2? 什么情况下使用 recon:inet_window/3?
    • 当前情况下用recon:inet_count/2(快照);持续累积的情况下用后者
  • 操作系统报告的内存情况和Erlang的内存函数报告的情况有所不同的原因是什么?
  • 为何Erlang会在实际不忙时却看起来很忙?
    • 调度器调度和进程实际工作都会消耗cpu资源,导致无法区分是调度工作忙还是进程运行忙。
  • 你能找到节点中那些已经准备就绪但是又无法立即得到调度的进程吗?
    进程信息中的{status,waiting}。找出所有进程,根据supervisor模型,然后匹配{status,waiting}即可

动手题

运行 https://github.com/ferd/recon_demoUH中的代码,回答如下问题

  • 系统内存有多少?
    • recon_alloc:memory(used).
  • 节点耗费的CPU资源多吗?
    • recon:scheduler_usage(1000)
  • 可有进程的邮箱溢出了?
  • 哪个聊天进程(council_member)占用的内存最多?
    • recon:proc_count(memory,1).
  • 哪个聊天进程最耗 CPU?
    • recon:proc_count(reductions,1).
  • 哪个聊天进程最耗带宽?
    • recon:inet_count(oct,1)
  • 哪个聊天进程发送的TCP消息最多?哪个最少?
  • 你能找到节点中哪个进程同时持有多个连接或者文件描述符吗?
  • 你能找到节点中当前哪个函数被最多的进程同时调用吗?

你可能感兴趣的:(erlang in danger 第五章问题解答)