亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: application的heap一直增長(zhǎng),不下降 [打印本頁(yè)]

作者: linuxfellow    時(shí)間: 2015-03-17 06:13
標(biāo)題: application的heap一直增長(zhǎng),不下降
本帖最后由 linuxfellow 于 2015-03-17 06:14 編輯

用了一個(gè)開(kāi)源的application:  http://zeromq.org/
[1516]     0  1516    22300     7806   0       0             0 zeromg

cat /proc/1516/smap
00011000-03544000 rw-p 00000000 00:00 0          [heap]
Size:              54476 kB
Rss:               30380 kB
Pss:               30380 kB
Shared_Clean:          0 kB
Shared_Dirty:          0 kB
Private_Clean:         0 kB
Private_Dirty:     30380 kB
Referenced:        30380 kB
Anonymous:         30380 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB

該進(jìn)程有29MB heap。開(kāi)源代碼不至于犯這樣低級(jí)錯(cuò)誤吧。 是不是系統(tǒng)里有些參數(shù)沒(méi)有調(diào)好?
用的是uclibc,  #define DEFAULT_TRIM_THRESHOLD (256 * 1024)
uclibc里有沒(méi)有辦法讓heap早點(diǎn)回歸系統(tǒng)?
作者: 鎮(zhèn)水鐵牛    時(shí)間: 2015-03-17 07:18
zeromp中有很多函數(shù)有陷阱,有的函數(shù)調(diào)用后,需要你主動(dòng)去釋放內(nèi)存。
作者: 鎮(zhèn)水鐵牛    時(shí)間: 2015-03-17 07:19
你把代碼貼上來(lái),我給你瞅瞅端倪?
作者: linuxfellow    時(shí)間: 2015-03-17 07:57
本帖最后由 linuxfellow 于 2015-03-17 07:58 編輯

太感謝樓上。這些都是應(yīng)用層的代碼。他們有問(wèn)題查不出來(lái),讓我們做內(nèi)核的來(lái)分析。明天向他們要代碼去。
作者: linuxfellow    時(shí)間: 2015-03-17 21:17
回復(fù) 3# 鎮(zhèn)水鐵牛
zmq_msg_t zmq_msg;
        void* context, * rsock,* ssock;
        int len,status;
        unsigned char *msg;

       context = zmq_ctx_new();
       rsock=zmq_socket(context,ZMQ_SUB);

       status =zmq_bind (rsock, argv[1] );


       zmq_setsockopt(rsock, ZMQ_SUBSCRIBE, NULL, 0);

       ssock =zmq_socket(context,ZMQ_PUB);
       status =zmq_bind (ssock, argv[2] );

       
       while(1)
       {
             zmq_msg_init (&zmq_msg);

             len = zmq_msg_recv (&zmq_msg, rsock, 0);
             if (len >= 0)
             {
                         zmq_msg_send (&zmq_msg, ssock, 0);
             }

             zmq_msg_close (&zmq_msg);
       }




   
作者: linuxfellow    時(shí)間: 2015-03-17 21:19
回復(fù) 3# 鎮(zhèn)水鐵牛


    代碼超簡(jiǎn)單,難道zmq_msg_t zmq_msg 里面有隱含指針要釋放?
作者: 鎮(zhèn)水鐵牛    時(shí)間: 2015-03-17 22:10
看起來(lái)好像沒(méi)什么問(wèn)題,建議你開(kāi)發(fā)的時(shí)候可以基于czmq這個(gè)高級(jí)zmq庫(kù).
給你個(gè)xpub-xsub的demo.
int main (void)
{
    setup_test_environment();
    void *ctx = zmq_ctx_new ();
    assert (ctx);

    //  First, create an intermediate device
    void *xpub = zmq_socket (ctx, ZMQ_XPUB);
    assert (xpub);
    int rc = zmq_bind (xpub, "tcp://127.0.0.1:5560");
    assert (rc == 0);
    void *xsub = zmq_socket (ctx, ZMQ_XSUB);
    assert (xsub);
    rc = zmq_bind (xsub, "tcp://127.0.0.1:5561");
    assert (rc == 0);

    //  Create a publisher
    void *pub = zmq_socket (ctx, ZMQ_PUB);
    assert (pub);
    rc = zmq_connect (pub, "tcp://127.0.0.1:5561");
    assert (rc == 0);

    //  Create a subscriber
    void *sub = zmq_socket (ctx, ZMQ_SUB);
    assert (sub);
    rc = zmq_connect (sub, "tcp://127.0.0.1:5560");
    assert (rc == 0);

    //  Subscribe for all messages.
    rc = zmq_setsockopt (sub, ZMQ_SUBSCRIBE, "", 0);
    assert (rc == 0);

    //  Pass the subscription upstream through the device
    char buff [32];
    rc = zmq_recv (xpub, buff, sizeof (buff), 0);
    assert (rc >= 0);
    rc = zmq_send (xsub, buff, rc, 0);
    assert (rc >= 0);

    //  Wait a bit till the subscription gets to the publisher
    msleep (SETTLE_TIME);

    //  Send an empty message
    rc = zmq_send (pub, NULL, 0, 0);
    assert (rc == 0);

    //  Pass the message downstream through the device
    rc = zmq_recv (xsub, buff, sizeof (buff), 0);
    assert (rc >= 0);
    rc = zmq_send (xpub, buff, rc, 0);
    assert (rc >= 0);

    //  Receive the message in the subscriber
    rc = zmq_recv (sub, buff, sizeof (buff), 0);
    assert (rc == 0);

    //  Clean up.
    rc = zmq_close (xpub);
    assert (rc == 0);
    rc = zmq_close (xsub);
    assert (rc == 0);
    rc = zmq_close (pub);
    assert (rc == 0);
    rc = zmq_close (sub);
    assert (rc == 0);
    rc = zmq_ctx_term (ctx);
    assert (rc == 0);

    return 0 ;
}
作者: 鎮(zhèn)水鐵牛    時(shí)間: 2015-03-17 22:20
zmsg的demo,這個(gè)更容易掌握。
//  Selftest

int
zmsg_test (bool verbose)
{
    printf (" * zmsg: ");

    int rc = 0;
    //  @selftest
    zctx_t *ctx = zctx_new ();
    assert (ctx);

    void *output = zsocket_new (ctx, ZMQ_PAIR);
    assert (output);
    zsocket_bind (output, "inproc://zmsg.test");
    void *input = zsocket_new (ctx, ZMQ_PAIR);
    assert (input);
    zsocket_connect (input, "inproc://zmsg.test");

    //  Test send and receive of single-frame message
    zmsg_t *msg = zmsg_new ();
    assert (msg);
    zframe_t *frame = zframe_new ("Hello", 5);
    assert (frame);
    zmsg_push (msg, frame);
    assert (zmsg_size (msg) == 1);
    assert (zmsg_content_size (msg) == 5);
    rc = zmsg_send (&msg, output);
    assert (msg == NULL);
    assert (rc == 0);

    msg = zmsg_recv (input);
    assert (msg);
    assert (zmsg_size (msg) == 1);
    assert (zmsg_content_size (msg) == 5);
    zmsg_destroy (&msg);

    //  Test send and receive of multi-frame message
    msg = zmsg_new ();
    assert (msg);
    rc = zmsg_addmem (msg, "Frame0", 6);
    assert (rc == 0);
    rc = zmsg_addmem (msg, "Frame1", 6);
    assert (rc == 0);
    rc = zmsg_addmem (msg, "Frame2", 6);
    assert (rc == 0);
    rc = zmsg_addmem (msg, "Frame3", 6);
    assert (rc == 0);
    rc = zmsg_addmem (msg, "Frame4", 6);
    assert (rc == 0);
    rc = zmsg_addmem (msg, "Frame5", 6);
    assert (rc == 0);
    rc = zmsg_addmem (msg, "Frame6", 6);
    assert (rc == 0);
    rc = zmsg_addmem (msg, "Frame7", 6);
    assert (rc == 0);
    rc = zmsg_addmem (msg, "Frame8", 6);
    assert (rc == 0);
    rc = zmsg_addmem (msg, "Frame9", 6);
    assert (rc == 0);
    zmsg_t *copy = zmsg_dup (msg);
    assert (copy);
    rc = zmsg_send (&copy, output);
    assert (rc == 0);
    rc = zmsg_send (&msg, output);
    assert (rc == 0);

    copy = zmsg_recv (input);
    assert (copy);
    assert (zmsg_size (copy) == 10);
    assert (zmsg_content_size (copy) == 60);
    zmsg_destroy (&copy);

    msg = zmsg_recv (input);
    assert (msg);
    assert (zmsg_size (msg) == 10);
    assert (zmsg_content_size (msg) == 60);

    // create empty file for null test
    FILE *file = fopen ("zmsg.test", "w");
    assert (file);
    fclose (file);

    file = fopen ("zmsg.test", "r");
    zmsg_t *null_msg = zmsg_load (NULL, file);
    assert (null_msg == NULL);
    fclose (file);
    remove ("zmsg.test");

    //  Save to a file, read back
    file = fopen ("zmsg.test", "w");
    assert (file);
    rc = zmsg_save (msg, file);
    assert (rc == 0);
    fclose (file);

    file = fopen ("zmsg.test", "r");
    rc = zmsg_save (msg, file);
    assert (rc == -1);
    fclose (file);
    zmsg_destroy (&msg);

    file = fopen ("zmsg.test", "r");
    msg = zmsg_load (NULL, file);
    assert (msg);
    fclose (file);
    remove ("zmsg.test");
    assert (zmsg_size (msg) == 10);
    assert (zmsg_content_size (msg) == 60);

    //  Remove all frames except first and last
    int frame_nbr;
    for (frame_nbr = 0; frame_nbr < 8; frame_nbr++) {
        zmsg_first (msg);
        frame = zmsg_next (msg);
        zmsg_remove (msg, frame);
        zframe_destroy (&frame);
    }
    //  Test message frame manipulation
    assert (zmsg_size (msg) == 2);
    frame = zmsg_last (msg);
    assert (zframe_streq (frame, "Frame9"));
    assert (zmsg_content_size (msg) == 12);
    frame = zframe_new ("Address", 7);
    assert (frame);
    zmsg_wrap (msg, frame);
    assert (zmsg_size (msg) == 4);
    rc = zmsg_addstr (msg, "Body");
    assert (rc == 0);
    assert (zmsg_size (msg) == 5);
    frame = zmsg_unwrap (msg);
    zframe_destroy (&frame);
    assert (zmsg_size (msg) == 3);
    char *body = zmsg_popstr (msg);
    assert (streq (body, "Frame0"));
    free (body);
    zmsg_destroy (&msg);

    //  Test encoding/decoding
    msg = zmsg_new ();
    assert (msg);
    byte *blank = (byte *) zmalloc (100000);
    assert (blank);
    rc = zmsg_addmem (msg, blank, 0);
    assert (rc == 0);
    rc = zmsg_addmem (msg, blank, 1);
    assert (rc == 0);
    rc = zmsg_addmem (msg, blank, 253);
    assert (rc == 0);
    rc = zmsg_addmem (msg, blank, 254);
    assert (rc == 0);
    rc = zmsg_addmem (msg, blank, 255);
    assert (rc == 0);
    rc = zmsg_addmem (msg, blank, 256);
    assert (rc == 0);
    rc = zmsg_addmem (msg, blank, 65535);
    assert (rc == 0);
    rc = zmsg_addmem (msg, blank, 65536);
    assert (rc == 0);
    rc = zmsg_addmem (msg, blank, 65537);
    assert (rc == 0);
    free (blank);
    assert (zmsg_size (msg) == 9);
    byte *buffer;
    size_t buffer_size = zmsg_encode (msg, &buffer);
    zmsg_destroy (&msg);
    msg = zmsg_decode (buffer, buffer_size);
    assert (msg);
    free (buffer);
    zmsg_destroy (&msg);

    //  Now try methods on an empty message
    msg = zmsg_new ();
    assert (msg);
    assert (zmsg_size (msg) == 0);
    assert (zmsg_unwrap (msg) == NULL);
    assert (zmsg_first (msg) == NULL);
    assert (zmsg_last (msg) == NULL);
    assert (zmsg_next (msg) == NULL);
    assert (zmsg_pop (msg) == NULL);
    assert (zmsg_send (&msg, output) == -1);
    assert (msg != NULL);
    zmsg_destroy (&msg);

    zctx_destroy (&ctx);
    //  @end
    printf ("OK\n");
    return 0;
}
作者: linuxfellow    時(shí)間: 2015-03-17 22:48
回復(fù) 7# 鎮(zhèn)水鐵牛

幫我再想想, 這么超級(jí)簡(jiǎn)單的調(diào)用為啥會(huì)有l(wèi)eak? zmq內(nèi)部自己有l(wèi)eak?


   
作者: 鎮(zhèn)水鐵牛    時(shí)間: 2015-03-17 23:09
    while(1)
       {
             zmq_msg_init (&zmq_msg);

             len = zmq_msg_recv (&zmq_msg, rsock, 0); //對(duì)端發(fā)送的消息是幾部分?
             if (len >= 0)
             {
                         zmq_msg_send (&zmq_msg, ssock, 0);
             }

             zmq_msg_close (&zmq_msg);
       }

你把收發(fā)端的代碼完整貼一下,我自己測(cè)試下看看。

你也可以Valgrind看看是哪里的異常。
作者: linuxfellow    時(shí)間: 2015-03-17 23:58
回復(fù) 10# 鎮(zhèn)水鐵牛
會(huì)不會(huì)接收進(jìn)程優(yōu)先級(jí)太低,接到的信息來(lái)不及處理,全部堆在那里?
我找找發(fā)送端代碼,貼上來(lái)

   
作者: linuxfellow    時(shí)間: 2015-03-18 04:34
我好像找到問(wèn)題了:
zmq_msg_init 應(yīng)該是沒(méi)有把以前在heap 里分配的指針free. 它只是在heap里再申請(qǐng)一塊新的。每次循環(huán)調(diào)用這個(gè)函數(shù)時(shí)就申請(qǐng)一塊新的。heap size自然就增加了。
作者: linuxfellow    時(shí)間: 2015-03-18 04:59
那個(gè)代碼對(duì)小message完全沒(méi)問(wèn)題。如果對(duì)大的message 就沒(méi)有釋放為content 指針?lè)峙涞膬?nèi)存
作者: linuxfellow    時(shí)間: 2015-03-18 06:02
本帖最后由 linuxfellow 于 2015-03-18 07:26 編輯

回復(fù) 10# 鎮(zhèn)水鐵牛
   如果zmq是大的message,  zmq_msg_close (&zmq) 有沒(méi)有釋放zmq.content所指的內(nèi)存? 我的理解是沒(méi)有。zmq.content所指的內(nèi)存沒(méi)有釋放,下次循環(huán)就不能用zmq_msg_init; 應(yīng)該用zmq_msg_init_data.傳一個(gè)free_mem函數(shù)進(jìn)去釋放zmq.content所擁有的內(nèi)存
作者: linuxfellow    時(shí)間: 2015-03-18 11:53
回復(fù) 14# linuxfellow

zmq_msg_close (&zmq)文檔有點(diǎn)含糊。這個(gè)函數(shù)只是把zmq標(biāo)志為“不再使用”,并沒(méi)有馬上回收。在我們的循環(huán)里,如果在zmq.content被釋放前馬上調(diào)用zmq_msg_init (&zmq),這樣就會(huì)有內(nèi)存泄露。
在調(diào)用zmq_msg_init (&zmq)前要先檢查并釋放zmq.content

   
作者: linuxfellow    時(shí)間: 2015-03-18 12:04
本帖最后由 linuxfellow 于 2015-03-18 12:58 編輯

會(huì)不會(huì)是個(gè)scope問(wèn)題?     zmq_msg_close 釋放內(nèi)存,只有在變量zmq_msg不在其有效范圍內(nèi)時(shí)才真正釋放內(nèi)存。
如果把zmq_msg_t zmq_msg定義在while循環(huán)外,zmq_msg總是有效,message不會(huì)被真正地free
如果把zmq_msg_t zmq_msg定義在while循環(huán)里,zmq_msg出了有效范圍,message就會(huì)被真正地free
while(1)
        {
              zmq_msg_t zmq_msg;   //把變量定義到while-loop里面就不會(huì)泄露了;這樣就會(huì)保證zmq_msg_close 正確工作?
              zmq_msg_init (&zmq_msg);

              len = zmq_msg_recv (&zmq_msg, rsock, 0);
              if (len >= 0)
              {
                          zmq_msg_send (&zmq_msg, ssock, 0);
              }

              zmq_msg_close (&zmq_msg);
        }



作者: 擇天記    時(shí)間: 2015-03-18 12:19
好復(fù)雜的樣子
作者: linuxfellow    時(shí)間: 2015-03-18 12:40
本帖最后由 linuxfellow 于 2015-03-18 12:56 編輯

回復(fù) 17# 擇天記
不復(fù)雜
3行代碼。 問(wèn)題是不是自己的代碼,沒(méi)法編譯運(yùn)行,只能想想各種可能。
以前對(duì)于應(yīng)用層的代碼,我只告訴他們你們的application有問(wèn)題,讓他們自己勞神去。

昨天壇里鎮(zhèn)水鐵牛老兄說(shuō)幫我瞧瞧代碼,我就向應(yīng)用層的同事要代碼,告訴他們問(wèn)題能解決。既然話說(shuō)出去了,就得解決問(wèn)題。 從沒(méi)用過(guò)zeromq, 臨時(shí)翻書(shū),想想可能的問(wèn)題。
問(wèn)題還是很有趣的。

但是下次決不干這種傻事了。


   
作者: nswcfd    時(shí)間: 2015-03-18 13:09
這是c++代碼么?行為會(huì)跟scope有關(guān)系?好詭異……
回復(fù) 16# linuxfellow


   
作者: 鎮(zhèn)水鐵牛    時(shí)間: 2015-03-18 22:22
回復(fù) 16# linuxfellow
在czmq的庫(kù)中,發(fā)現(xiàn)他們是把上面的函數(shù)經(jīng)過(guò)封裝的,當(dāng)時(shí)不確定,問(wèn)題找到就好,不過(guò)基于czmq開(kāi)發(fā)比較好,還有低版本的zmq是有缺陷的。
   
作者: linuxfellow    時(shí)間: 2015-03-18 23:40
本帖最后由 linuxfellow 于 2015-03-19 00:16 編輯

回復(fù) 20# 鎮(zhèn)水鐵牛
這些還是猜測(cè),以前沒(méi)有用過(guò),自己沒(méi)法測(cè)試,一切都是紙上談兵,F(xiàn)在問(wèn)題的關(guān)鍵就是:
大的message ,從heap分配內(nèi)存到zmq_msg.content,誰(shuí)負(fù)責(zé)free它?zmq_msg_close有沒(méi)有釋放它
憑你的經(jīng)驗(yàn),能說(shuō)說(shuō)這個(gè)指針是如何釋放的?
對(duì)了,czmq里這個(gè)指針是如何釋放的?

   
作者: linuxfellow    時(shí)間: 2015-03-18 23:44
本帖最后由 linuxfellow 于 2015-03-18 23:49 編輯

回復(fù) 20# 鎮(zhèn)水鐵牛
給其他部門(mén)的建議不能隨便提。問(wèn)題解決不了,提一些讓人推倒重來(lái)的建議,會(huì)遭人鄙視的。無(wú)論如何要先解決問(wèn)題
作者: 鎮(zhèn)水鐵牛    時(shí)間: 2015-03-19 00:24
你這樣改下,試試看。      
       while(1)
       {
             zmq_msg_t zmq_msg;
             zmq_msg_init (&zmq_msg);
             len = zmq_msg_recv (&zmq_msg, rsock, 0);
             if (len >= 0)  {
                         zmq_msg_send (&zmq_msg, ssock, 0);//是這里free掉了,你進(jìn)去看下代碼。
             } else {
                        zmq_msg_close (&zmq_msg);
                        break;
            }            
       }
作者: linuxfellow    時(shí)間: 2015-03-20 09:44
本帖最后由 linuxfellow 于 2015-03-20 10:37 編輯

回復(fù) 23# 鎮(zhèn)水鐵牛
問(wèn)題還沒(méi)有解決,上面那個(gè)還是不行, app認(rèn)為指針是在zmq_msg_close()里釋放:

if (u.base.type == type_lmsg) {

        //  If the content is not shared, or if it is shared and the reference
        //  count has dropped to zero, deallocate it.
        if (!(u.lmsg.flags & msg_t::shared) ||
              !u.lmsg.content->refcnt.sub (1)) {

            //  We used "placement new" operator to initialize the reference
            //  counter so we call the destructor explicitly now.
            u.lmsg.content->refcnt.~atomic_counter_t ();

            if (u.lmsg.content->ffn)
                u.lmsg.content->ffn (u.lmsg.content->data,
                    u.lmsg.content->hint);
            free (u.lmsg.content);
        }
    }
有兩個(gè)情況下內(nèi)存不從heap里釋放:
u.lmsg.flags & msg_t::shared
u.lmsg.content->refcnt.sub (1)   --〉是不是另外一端如果不取。
這兩個(gè)條件在什么條件下設(shè)置?

如果u.lmsg.content->refcnt.sub (1)  是真, 另外一端一直不取,zmq_msg_close()返回的時(shí)候u.lmsg.content沒(méi)有被釋放。
接著進(jìn)行下一輪:zmq_msg_init().   u.lmsg.content沒(méi)有被釋放, zmq_msg_init怎么辦?
重用u.lmsg.content里的內(nèi)存,它如何知道subscriber接受過(guò)這個(gè)信息沒(méi)有?
申請(qǐng)一塊新的內(nèi)存? 已有的u.lmsg.content里的內(nèi)存是不是就丟了,造成泄漏?

作者: linuxfellow    時(shí)間: 2015-03-20 10:17
回復(fù) 23# 鎮(zhèn)水鐵牛
鐵牛兄弟,你把我抬上轎了,我現(xiàn)在還沒(méi)有下來(lái)呀,幫我好好想想上面的問(wèn)題。
短短的3行代碼,有內(nèi)存泄露,一夜之間heap漲到30兆。多謝了。!


   
作者: linuxfellow    時(shí)間: 2015-03-20 12:40
本帖最后由 linuxfellow 于 2015-03-20 19:44 編輯

,,,,,,,,,,
作者: 鎮(zhèn)水鐵牛    時(shí)間: 2015-03-20 20:07
現(xiàn)在搞定么?基于czmq開(kāi)發(fā),這些問(wèn)題都沒(méi)有了,czmq的代碼是能兼容zmq的,沒(méi)風(fēng)險(xiǎn)。
作者: linuxfellow    時(shí)間: 2015-03-20 21:06
回復(fù) 27# 鎮(zhèn)水鐵牛
還有一些問(wèn)題:
zmq_msg_close (&zmq_msg) 返回時(shí)zmq_msg.content沒(méi)能釋放,因?yàn)榻邮芏诉沒(méi)有取
這種情況下,下一次循環(huán)時(shí),zmq_msg_init 如何處理zmq_msg.content
如果zmq_msg_recv馬上又接到一個(gè)大的新message, zmq_msg_recv如何處理還沒(méi)來(lái)得及釋放的zmq_msg.content?  鏈到一起?會(huì)不會(huì)抹掉沒(méi)能釋放zmq_msg.content?
發(fā)送端調(diào)用zmq_msg_close后,zmq_msg.content沒(méi)能釋放,因?yàn)榻邮芏诉沒(méi)有取。接受端就得負(fù)責(zé)釋放zmq_msg.content。接受端如何保證釋放發(fā)送端zmq_msg_close后的zmq_msg.content


   
作者: 鎮(zhèn)水鐵牛    時(shí)間: 2015-03-20 21:29
回復(fù) 28# linuxfellow
具體我沒(méi)有深究,如果有內(nèi)存泄露,用memcheck檢測(cè)下,我一直用czmp開(kāi)發(fā)的哈。

   
作者: linuxfellow    時(shí)間: 2015-03-20 21:50
本帖最后由 linuxfellow 于 2015-03-20 22:44 編輯

回復(fù) 29# 鎮(zhèn)水鐵牛
有內(nèi)存泄露, 一夜之間RSS漲到7357頁(yè)。不然我不會(huì)在這里費(fèi)勁
root@abc:[/opt]: dmesg  
[ 7785]     0  7785    17378     7357   0       0             0 zmq

你就當(dāng)我這些問(wèn)題是問(wèn)czmp的, 如果是同樣的init/recv/send函數(shù)在czmp用,發(fā)送端沒(méi)有來(lái)得及釋放的zmq.content是如何最終被接收端正確地釋放的?
能不能拿czmp的實(shí)現(xiàn)來(lái)回答一下我上面的問(wèn)題? 既然czmp和zmq兼容,處理的方法應(yīng)該差不多


   
作者: linuxfellow    時(shí)間: 2015-03-22 18:25
回復(fù) 27# 鎮(zhèn)水鐵牛
czmp里如果publisher一直轉(zhuǎn)發(fā)大的消息,卻沒(méi)有任何subscriber取,這時(shí)候czmp是如何處理堆積起來(lái)的message的?應(yīng)該有一個(gè)超時(shí)機(jī)制清除堆積起來(lái)無(wú)人認(rèn)領(lǐng)的消息吧? 不然的話內(nèi)存也會(huì)被消耗光的


   
作者: 鎮(zhèn)水鐵牛    時(shí)間: 2015-03-22 18:34
回復(fù) 33# linuxfellow
根據(jù)zmq的文檔說(shuō)明,如果沒(méi)有sub的話,消息會(huì)在pub端被丟棄的,我們應(yīng)用中經(jīng)常會(huì)發(fā)幾百K左右的數(shù)據(jù),沒(méi)遇到問(wèn)題。
提醒下,zmq不是線程安全的。

   
作者: linuxfellow    時(shí)間: 2015-03-22 18:42
本帖最后由 linuxfellow 于 2015-03-22 18:57 編輯

回復(fù) 34# 鎮(zhèn)水鐵牛
我們有兩個(gè)同樣的zmq在運(yùn)行,回去研究一下,多謝


   
作者: linuxfellow    時(shí)間: 2015-03-22 19:00
回復(fù) 34# 鎮(zhèn)水鐵牛
如果有sub,只是sub的優(yōu)先級(jí)太低,或出什么問(wèn)題了,不能取,server端的message又作如何處理?有超時(shí)處理嗎?


   
作者: 鎮(zhèn)水鐵牛    時(shí)間: 2015-03-22 20:17
回復(fù) 36# linuxfellow
在pub端和sub端都是有buffer的,這個(gè)buffer可以調(diào)整的,默認(rèn)好像是1K個(gè)frame,如果溢出,則會(huì)主動(dòng)drop;
你的那些疑問(wèn),既然是個(gè)動(dòng)態(tài)庫(kù),它肯定對(duì)這種情況是有處理的,只是我也沒(méi)有那樣深究,表示不懂哈。

   
作者: iewj    時(shí)間: 2016-06-02 10:44
這個(gè)最后怎么解決的?我也遇到這個(gè)問(wèn)題,擦。
作者: linuxfellow    時(shí)間: 2016-07-19 07:31
本帖最后由 linuxfellow 于 2016-07-19 07:34 編輯

回復(fù) 36# iewj

沒(méi)有解決,問(wèn)題只在測(cè)試中出現(xiàn),不在產(chǎn)品中出現(xiàn);app的人沒(méi)有興趣解決,我也不好上桿子去給別人做。最后不了了之,等著用戶發(fā)現(xiàn)問(wèn)題再說(shuō)。如果你解決了,請(qǐng)發(fā)上來(lái)看看
不好意思,好久沒(méi)有登錄,回復(fù)不及時(shí),抱歉!

   




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2