freeswitch mod_event_socket高性能版本

本文详细介绍了优化mod_event_socket模块性能的方法,包括使用epoll替代poll进行数据包收发,添加接收缓冲区以提高效率,以及实现数据报字段过滤功能。通过这些优化,系统并发性能得到显著提升。

近日研究了下mod_event_socket源码,发现socket用的是poll,并且接收到的时候没有用到缓冲,严重影响系统性能,有必要进行数据包的收发进行优化处理,保证通讯的畅通。本人通过一下方式优化,系统并发性能有着显著的提升。

一、数据报字段过滤功能

<configuration name="event_socket.conf" description="Socket Client">
  <settings>
    <param name="nat-map" value="false"/>
    <param name="listen-ip" value="127.0.0.1"/>
    <param name="listen-port" value="8021"/>
    <param name="password" value="ClueCon"/>
    <!--<param name="apply-inbound-acl" value="lan"/>-->
    <param name="event-whitelists" value=""/> <!-- 事件白名单,全部字段写入 -->
		<param name="valid-variant-prefixs" value=""/> <!-- 字段前缀匹配白名单,字段写入 -->
		<param name="valid-variant-includes" value=""/> <!-- 字段包含匹配白名单,字段写入 -->
		<param name="invalid-variant-prefixs" value=""/> <!-- 字段前缀匹配黑名单,字段去除 -->
		<param name="invalid-variant-includes" value=""/> <!-- 字段包含匹配黑名单,字段去除 --> 
  </settings>
</configuration>

二、改poll为epoll收发数据包

源代码如下:

static switch_status_t read_packet(listener_t *listener, switch_event_t **event, uint32_t seconds)
{
	char buf[65536] = "";
	switch_status_t status = SWITCH_STATUS_SUCCESS;
	int count = 0;
	uint32_t elapsed = 0;
	time_t start = 0;
	uint8_t do_sleep = 1;
	void *pop;
	switch_size_t buf_len = sizeof(buf);
	switch_channel_t *channel = NULL;

	*event = NULL;
	start = switch_epoch_time_now(NULL);

	if (prefs.done) {
		switch_goto_status(SWITCH_STATUS_FALSE, end);
	}

	if (listener->session) {
		channel = switch_core_session_get_channel(listener->session);
	}

	while (listener->sock && !prefs.done) {
		
		char *packet = NULL, *val = NULL;
		switch_size_t len, packet_len, clen = 0, total_len = 0;

		len = switch_buffer_ignore_space(listener->re
<think>我们正在处理一个关于FreeSWITCH的问题。用户想要检查FreeSWITCH模块中是否存在mod_rtp_stats和mod_event_socket,通过fs_cli命令和grep过滤输出。 具体步骤: 1. 连接到FreeSWITCH的fs_cli控制台。 2. 在fs_cli中执行命令:show modules 3. 使用grep过滤输出,查找mod_rtp_stats和mod_event_socket模块。 但是,由于我们是在文本环境中,无法实际执行命令,因此我们将提供操作步骤和预期的输出示例。 注意:用户可能希望直接在终端中执行一条命令来检查,所以我们可以建议使用如下命令组合: fs_cli -x "show modules" | grep -E "mod_rtp_stats|mod_event_socket" 解释: - fs_cli -x "command" 执行命令并退出(非交互模式) - 然后通过grep使用正则表达式匹配两个模块名。 如果模块已加载,输出将显示包含模块名称的行;如果没有加载,则不会有输出(或者grep没有匹配到)。 另外,我们也可以单独检查每个模块。 但是,请注意,在FreeSWITCH中,默认情况下mod_event_socket是核心模块,几乎总是加载的。而mod_rtp_stats是一个提供RTP统计的模块,可能需要额外配置。 下面我们提供具体的步骤:</think>要检查FreeSWITCH是否加载了`mod_rtp_stats`和`mod_event_socket`模块,请通过`fs_cli`执行以下步骤: ### 操作步骤 1. **进入`fs_cli`控制台**: ```bash fs_cli ``` 2. **查看所有模块并过滤**: 在`fs_cli`中执行: ```bash show modules | grep -E "mod_rtp_stats|mod_event_socket" ``` ### 预期输出示例 - 如果模块已加载: ```text 50, mod_rtp_stats 35, mod_event_socket ``` (开头的数字表示模块加载顺序) - 如果未加载: ```text (无输出) ``` ### 替代方案(单命令) ```bash fs_cli -x "show modules" | grep -E "mod_rtp_stats|mod_event_socket" ``` ### 关键说明 1. **`mod_event_socket`**: - 默认**核心模块**,提供事件通信接口(ESL)[^1] - 未加载时无法使用`fs_cli` 2. **`mod_rtp_stats`**: - 可选模块,提供RTP质量统计 - 需在`autoload_configs/modules.conf.xml`中启用: ```xml <load module="mod_rtp_stats"/> ``` ### 验证结果 - **找到输出行** → 模块已加载 - **无输出** → 需检查: 1. 模块配置文件 2. FreeSWITCH日志:`grep rtp_stats /usr/local/freeswitch/log/freeswitch.log` --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值