Phần mềm FreeSwitch đã chạy tốt trong vài ngày (~ 3 - 5 ngày), sau đó các yêu cầu cuộc gọi đến mới được chấp nhận do FreeSwitch bị chặn!! không được chấp nhận Cuộc gọi mới. Tôi đã chụp ảnh nhanh FreeSwitch và phân tích nó trong GDB.
Tôi có 601 Therads, hầu hết đều đang chờ
Chủ đề 0x7f16bc55f700 (LWP 28544) pthread_cond_wait@@GLIBC_2.3.2 () tại ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:185
Khi tôi áp dụng "luồng áp dụng tất cả bt" trong gdb, tôi thấy rằng hầu hết các luồng đang cố chèn các sự kiện vào hàng đợi (switch_queue_push)
Chủ đề 600 (Chủ đề 0x7f16bc55f700 (LWP 28544)):
#0 pthread_cond_wait@@GLIBC_2.3.2 () tại ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:185
#1 0x00007f180cf9b87d trong apr_thread_cond_wait (cond=, mutex=) tại lock/unix/thread_cond.c:68
#2 0x00007f180cf92dd0 trong apr_queue_push (queue=queue@entry=0x7f180db157a8, data=data@entry=0x7f16d3d5ec20) tại misc/apr_queue.c:166
#3 0x00007f180cc958fb trong switch_queue_push (queue=0x7f180db157a8, data=data@entry=0x7f16d3d5ec20) tại src/switch_apr.c:1134
#4 0x00007f180cd17850 trong switch_event_queue_dispatch_event (eventp=0x7f16bc55ec48) tại 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, sự kiện=event@entry=0x7f16bc55ec48, user_data=user_data@entry=0x0) tại src/switch_event.c:1986
#6 0x00007f180cc9f118 trong switch_channel_perform_set_running_state (channel=0x7f17e3e7de00, state=CS_NEW, file=0x7f180cfbc590 "src/switch_core_state_machine.c", func=, line=543) tại src/switch_channel.c:2260
#7 0x00007f180ccc87d0 trong switch_core_session_run (session=0x7f17e3e7fd28) tại src/switch_core_state_machine.c:543
#8 0x00007f180ccc36de trong switch_core_session_thread (thread=, obj=0x7f17e3e7fd28) tại src/switch_core_session.c:1629
#9 0x00007f180ccbf47d trong switch_core_session_thread_pool_worker (thread=0x7f17e3e9abb0, obj=0x80) tại src/switch_core_session.c:1692
#10 0x00007f180cfa1910 trong dummy_worker (opaque=0x7f17e3e9abb0) tại threadproc/unix/thread.c:151
#11 0x00007f180c1e0064 trong start_thread (arg=0x7f16bc55f700) tại pthread_create.c:309
#12 0x00007f180b8b862d trong bản sao () tại ../sysdeps/unix/sysv/linux/x86_64/clone.S:111
Tại sao tôi nhận được trạng thái này? Bất kỳ ý tưởng, mẹo, thủ thuật nào cũng sẽ được đánh giá cao. lời chào,
Tôi đã đào sâu hơn và tìm ra giải pháp của mình,
Những điều bạn nên biết về Freeswitchcơ chế xử lý sự kiện" có thể giải quyết vấn đề này. Bởi vì có nhiều luồng sản xuất sinh ra và đưa các sự kiện của họ vào hàng đợi này, nhưng chỉ có một luồng tiêu dùng trong cơ chế này. Chuỗi tiêu dùng với tư cách là một trình xử lý sự kiện đã biết sẽ phân phối sự kiện đến tất cả Người nghe, chẳng hạn như mô-đun lắng nghe các sự kiện thích hợp.
Một hoặc nhiều trình nghe này có thể chặn (bằng cách chặn) chuỗi tiêu dùng này và hàng đợi sự kiện có thể đầy. Khi hàng đợi sự kiện đầy, công tắc tính phí của bạn sẽ bị chặn.
Ba giải pháp cho những vấn đề này:
1:Trong cấu hình mặc định, cơ chế xử lý sự kiện sử dụng hàng đợi sự kiện. Tuy nhiên, bạn có thể sử dụng giải pháp tạo luồng để thay đổi "sự kiện-use-dispatch=false"Giá trị trong"post_load_switch.conf" trong tập tin.
2: Tăng số lượng luồng tiêu dùng dưới dạng một luồng tiêu dùng không phải là giải pháp tốt cho các máy chủ freeswitch được tải nặng mà bạn có thể sử dụng "post_load_switch.conf"trong hồ sơ"sự kiện ban đầu-chủ đề=X” để đạt được, trong đó X đại diện cho số lượng luồng ban đầu.
3:Trong mô-đun của bạn, bạn cũng có thể sử dụng cơ chế xử lý sự kiện. Khi bạn nhận được các sự kiện từ lõi của Freeswitch, hãy tạo một chuỗi mới và gán nó cho chuỗi mới tạo của bạn để nó không chờ chuỗi tiêu dùng của Freeswitch.
Tôi là một lập trình viên xuất sắc, rất giỏi!