簡體   English   中英

自由開關被阻止

[英]Freeswitch Blocked

FreeSwitch軟件在幾天之內(〜3-5天)運行良好,由於FreeSwitch被阻止,因此可以接受新的來電請求! 正在進行的呼叫繼續其會話,它們的呼叫似乎沒有受到影響,但是不接受新的呼叫。 我得到了FreeSwitch快照,並在GDB中對其進行了分析。

我有601位therads,其中大多數人正在等待

Thread 0x7f16bc55f700 (LWP 28544) pthread_cond_wait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:185

當我在gdb中應用“線程應用所有bt”時,我看到大多數線程都試圖將事件推送到隊列中(switch_queue_push)

Thread 600 (Thread 0x7f16bc55f700 (LWP 28544)):
#0 pthread_cond_wait@@GLIBC_2.3.2 () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:185
#1  0x00007f180cf9b87d in apr_thread_cond_wait (cond=<optimized out>, mutex=<optimized out>) at locks/unix/thread_cond.c:68
#2  0x00007f180cf92dd0 in apr_queue_push (queue=queue@entry=0x7f180db157a8, data=data@entry=0x7f16d3d5ec20) at misc/apr_queue.c:166
#3  0x00007f180cc958fb in switch_queue_push (queue=0x7f180db157a8, data=data@entry=0x7f16d3d5ec20) at src/switch_apr.c:1134
#4  0x00007f180cd17850 in switch_event_queue_dispatch_event (eventp=0x7f16bc55ec48) at src/switch_event.c:384
#5  switch_event_fire_detailed (file=file@entry=0x7f180cfb07ea "src/switch_channel.c", func=func@entry=0x7f180cfb2ba0 <__func__.18348> "switch_channel_perform_set_running_state", line=line@entry=2260, event=event@entry=0x7f16bc55ec48, user_data=user_data@entry=0x0) at src/switch_event.c:1986
#6  0x00007f180cc9f118 in switch_channel_perform_set_running_state (channel=0x7f17e3e7de00, state=CS_NEW, file=0x7f180cfbc590 "src/switch_core_state_machine.c", func=<optimized out>, line=543) at src/switch_channel.c:2260
#7  0x00007f180ccc87d0 in switch_core_session_run (session=0x7f17e3e7fd28) at src/switch_core_state_machine.c:543
#8  0x00007f180ccc36de in switch_core_session_thread (thread=<optimized out>, obj=0x7f17e3e7fd28) at src/switch_core_session.c:1629
#9  0x00007f180ccbf47d in switch_core_session_thread_pool_worker (thread=0x7f17e3e9abb0, obj=0x80) at src/switch_core_session.c:1692
#10 0x00007f180cfa1910 in dummy_worker (opaque=0x7f17e3e9abb0) at threadproc/unix/thread.c:151
#11 0x00007f180c1e0064 in start_thread (arg=0x7f16bc55f700) at pthread_create.c:309
#12 0x00007f180b8b862d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111

為什么我要進入這種狀態? 任何想法,技巧和竅門將不勝感激。 問候,

我已經深入研究並找到了解決方案,

您應該了解Freeswitch的“ 事件處理程序機制 ”以解決此問題。 因為有許多生產者線程會生成事件並將其事件放入此隊列,但是此機制中僅存在一個使用者線程。 消費者線程(稱為事件處理程序)將事件傳遞給所有偵聽器,例如偵聽適當事件的模塊。

這些監聽器中的一個或多個可以阻止(通過阻止)此使用者線程,並且事件隊列可能變得很滿。 當事件隊列已滿時,您的費用切換將被阻止。

解決這些問題有三種解決方案:

1:在默認配置下,事件處理程序機制使用事件隊列。 但是,您可以通過更改“ post_load_switch.conf ”文件中的“ events-use-dispatch = false ”值來使用線程解決方案。

2:增加使用者線程數,因為單個使用者線程不是重載freeswitch服務器的好解決方案,您可以使用“ post_load_switch.conf ”文件中的“ initial-event-threads = X ”來完成,其中X表示初始線程數。

3:在模塊中,您也可以使用事件處理程序機制。 當您從Freeswitch的核心獲取事件時,請創建一個新線程並將其分配到您新創建的線程中,以便不等待Freeswitch的使用者線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM