最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Erlang項目內存泄漏分析方法

 更新時間:2015年02月03日 08:50:04   投稿:junjie  
這篇文章主要介紹了Erlang項目內存泄漏分析方法,本文講解了分析方法、分析流程并找到問題原因和解決方法,需要的朋友可以參考下

隨著項目越來越依賴Erlang,碰到的問題也隨之增加。前段時間線上系統(tǒng)碰到內存高消耗問題,記錄一下troubleshooting的分析過程。線上系統(tǒng)用的是Erlang R16B02版本。

問題描述

有幾臺線上系統(tǒng),運行一段時間,內存飆升。系統(tǒng)模型很簡單,有網(wǎng)絡連接,pool中找新的process進行處理。top命令觀察,發(fā)現(xiàn)內存都被Erlang進程給吃完了,netstat命令查看網(wǎng)絡連接數(shù),才區(qū)區(qū)幾K。問題應該是Erlang內存泄漏了。

分析方法

Erlang系統(tǒng)有個好處,可以直接進入線上系統(tǒng),在生產(chǎn)現(xiàn)場分析問題。我們系統(tǒng)是通過Rebar管理的,可以用不同方法進入線上系統(tǒng)。

本機登錄

可以直接登錄到線上機器,然后通過以下命令attach到Erlang系統(tǒng)里面

復制代碼 代碼如下:

$ cd /path/to/project
$ rel/xxx/bin/xxx attach
(node@host)>

通過remote shell

獲取Erlang系統(tǒng)的cookie

復制代碼 代碼如下:

$ ps -ef |grep beam  %%找到參數(shù) --setcookie

新開一個shell,使用同樣的cookie,不同的nodename
復制代碼 代碼如下:

$ erl --setcookie cookiename -name test@127.0.0.1

用start remote shell進入系統(tǒng)
復制代碼 代碼如下:

Erlang R16B02 (erts-5.10.3) [source] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V5.10.3  (abort with ^G)
(test1@127.0.0.1)1> net_adm:ping('node@127.0.0.1').
pong
(test1@127.0.0.1)2> nodes().
['node@127.0.0.1']
(test1@127.0.0.1)3>
User switch command
 --> h
  c [nn]            - connect to job
  i [nn]            - interrupt job
  k [nn]            - kill job
  j                 - list all jobs
  s [shell]         - start local shell
  r [node [shell]]  - start remote shell
  q                 - quit erlang
  ? | h             - this message
 --> r 'node@127.0.0.1'
 --> j
   1  {shell,start,[init]}
   2* {'node@127.0.0.1',shell,start,[]}
 --> c 2

分析流程

Erlang有很多工具,可以分析系統(tǒng)信息,比如appmonwebtool。但是系統(tǒng)內存嚴重不足,已經(jīng)沒有辦法啟動這些工具了,幸好還有Erlang shell。

Erlang shell自帶了很多有用的命令,可以用help()方法查看

復制代碼 代碼如下:

> help().

Erlang系統(tǒng)內存消耗情況

top結果顯示,是內存問題,所以第一步可以先看看Erlang的系統(tǒng)內存消耗情況

復制代碼 代碼如下:

> erlang:memory().

memory()可以看到Erlang emulator分配的內存,有總的內存,atom消耗的內存,process消耗的內存等等。

Erlang process創(chuàng)建數(shù)量

線上系統(tǒng)發(fā)現(xiàn)主要內存消耗都在process上面,接下來要分析,是process內存泄漏了,還是process創(chuàng)建數(shù)量太多導致。

復制代碼 代碼如下:

> erlang:system_info(process_limit).  %%查看系統(tǒng)最多能創(chuàng)建多少process
> erlang:system_info(process_count).  %%當前系統(tǒng)創(chuàng)建了多少process

system_info()返回當前系統(tǒng)的一些信息,比如系統(tǒng)process,port的數(shù)量。執(zhí)行上面命令,大吃一驚,只有2,3k的網(wǎng)絡連接,結果Erlang process已經(jīng)有10多w了。系統(tǒng)process創(chuàng)建了,但是因為代碼或者其它原因,堆積沒有釋放。

查看單個process的信息

既然是因為process因為某種原因堆積了,只能從process里找原因了

先要獲取堆積process的pid

復制代碼 代碼如下:

> i().  %%返回system信息
> i(0,61,886).  %% (0,61,886)是pid

看到有很多process hang在那里,查看具體pid信息,發(fā)現(xiàn)message_queue有幾條消息沒有被處理。下面就用到強大的erlang:process_info()方法,它可以獲取進程相當豐富的信息。
復制代碼 代碼如下:

> erlang:process_info(pid(0,61,886), current_stacktrace).
> rp(erlang:process_info(pid(0,61,886), backtrace)).

查看進程的backtrace時,發(fā)現(xiàn)下面的信息
復制代碼 代碼如下:

0x00007fbd6f18dbf8 Return addr 0x00007fbff201aa00 (gen_event:rpc/2 + 96)
y(0)     #Ref<0.0.2014.142287>
y(1)     infinity
y(2)     {sync_notify,{log,{lager_msg,[], ..........}}
y(3)     <0.61.886>
y(4)     <0.89.0>
y(5)     []

process在處理Erlang第三方的日志庫lager時,hang住了。

問題原因

查看lager的文檔,發(fā)現(xiàn)以下信息

復制代碼 代碼如下:

Prior to lager 2.0, the gen_event at the core of lager operated purely in synchronous mode. Asynchronous mode is faster, but has no protection against message queue overload. In lager 2.0, the gen_event takes a hybrid approach. it polls its own mailbox size and toggles the messaging between synchronous and asynchronous depending on mailbox size.

{async_threshold, 20}, {async_threshold_window, 5}

This will use async messaging until the mailbox exceeds 20 messages, at which point synchronous messaging will be used, and switch back to asynchronous, when size reduces to 20 - 5 = 15.

If you wish to disable this behaviour, simply set it to 'undefined'. It defaults to a low number to prevent the mailbox growing rapidly beyond the limit and causing problems. In general, lager should process messages as fast as they come in, so getting 20 behind should be relatively exceptional anyway.


原來lager有個配置項,配置message未處理的數(shù)量,如果message堆積數(shù)超出,則會用 同步 方式處理!

當前系統(tǒng)打開了debug log,洪水般的log把系統(tǒng)給沖垮了。

老外也碰到類似問題,這個thread給我們的分析帶來很多幫助,感謝一下。

總結

Erlang提供了豐富的工具,可以在線進入系統(tǒng),現(xiàn)場分析問題,這個非常有助于高效、快速的定位問題。同時,強大的Erlang OTP讓系統(tǒng)有更穩(wěn)定的保證。我們還會繼續(xù)挖掘Erlang,期待有更多的實踐分享。

相關文章

  • Erlang中的OTP簡介

    Erlang中的OTP簡介

    這篇文章主要介紹了Erlang中的OTP簡介,OTP包含了一組庫和實現(xiàn)方式,可以構建大規(guī)模、容錯和分布式的應用程序,包含了許多強大的工具,能夠實現(xiàn)H248,SNMP等多種協(xié)議,需要的朋友可以參考下
    2015-03-03
  • Erlang語法學習筆記:變量、原子、元組、列表、字符串

    Erlang語法學習筆記:變量、原子、元組、列表、字符串

    這篇文章主要介紹了Erlang語法學習筆記:變量、原子、元組、列表、字符串,本文簡明總結了這5種類型的相關知識,需要的朋友可以參考下
    2015-01-01
  • Erlang程序設計(第2版)讀書筆記:Erlang安裝和基礎語法

    Erlang程序設計(第2版)讀書筆記:Erlang安裝和基礎語法

    這篇文章主要介紹了Erlang程序設計(第2版)讀書筆記:Erlang安裝和基礎語法,需要的朋友可以參考下
    2015-02-02
  • Erlang中的模塊與模式匹配介紹

    Erlang中的模塊與模式匹配介紹

    這篇文章主要介紹了Erlang中的模塊與模式匹配介紹,本文分別對模塊與模式匹配做了講解,需要的朋友可以參考下
    2015-03-03
  • Erlang中的基本元素操作小結

    Erlang中的基本元素操作小結

    這篇文章主要介紹了Erlang中的基本元素操作小結,本文講解了元組(tuple)、記錄(record)、列表(list)、映射組(map)等內容,需要的朋友可以參考下
    2015-03-03
  • Erlang中的Record詳解

    Erlang中的Record詳解

    這篇文章主要介紹了Erlang中的Record詳解,本文講解了定義Record、創(chuàng)建Record、訪問Record、更新Record、匹配Record和Guard語句、使用Record等內容,需要的朋友可以參考下
    2015-04-04
  • 深入淺析RabbitMQ鏡像集群原理

    深入淺析RabbitMQ鏡像集群原理

    當單臺 RabbitMQ 服務器的處理消息的能力達到瓶頸時,此時可以通過 RabbitMQ 集群來進行擴展,從而達到提升吞吐量的目的
    2021-08-08
  • erlang?on_load_function_failed排查過程解析

    erlang?on_load_function_failed排查過程解析

    這篇文章主要為大家介紹了erlang?on_load_function_failed的排查過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Erlang的一些編程技巧分享

    Erlang的一些編程技巧分享

    這篇文章主要介紹了Erlang的一些編程技巧分享,本文是是實際編程中的個人總結,需要的朋友可以參考下
    2015-01-01
  • Erlang初學:Erlang的一些特點和個人理解總結

    Erlang初學:Erlang的一些特點和個人理解總結

    這篇文章主要介紹了Erlang初學:Erlang的一些特點和個人理解總結,本文總結了函數(shù)式編程、一切都是常量、輕量進程、進程端口映射及典型缺點等內容,需要的朋友可以參考下
    2015-02-02

最新評論

顺义区| 额尔古纳市| 凭祥市| 芦溪县| 新龙县| 陇西县| 武功县| 高雄县| 沛县| 化德县| 平舆县| 利辛县| 蒙自县| 阿荣旗| 叶城县| 崇礼县| 崇左市| 连州市| 慈溪市| 五家渠市| 察隅县| 凤山县| 如皋市| 枣强县| 河源市| 盘山县| 大英县| 凤山市| 吉木乃县| 甘洛县| 运城市| 沙田区| 濮阳市| 天镇县| 兖州市| 准格尔旗| 内黄县| 安新县| 广丰县| 彭阳县| 长汀县|