Skip to content

关于“packet queue max!!!”相关问题的解法 #247

@GoToHiTori20070221

Description

@GoToHiTori20070221

关于“packet queue max!!!”相关问题的解法

2025-03-26 22:25 备注:如果官方更新了相关bug的修正,那本issus自动删除。

快速解决方法

将以下的所有代码替换到protocol\httpflv\writer.go中。
GitHub不允许直接传输.go文件,所以换了一下。

writer.go.TXT

错误日志(有点长)

nohup: ignoring input
time="2025-03-25T22:25:48+08:00" level=info msg="\n     _     _            ____       \n    | |   (_)_   _____ / ___| ___  \n    | |   | \\ \\ / / _ \\ |  _ / _ \\ \n    | |___| |\\ V /  __/ |_| | (_) |\n    |_____|_| \\_/ \\___|\\____|\\___/ \n        version: 0.0.20\n\t"
time="2025-03-25T22:25:48+08:00" level=info msg="HLS server enable...."
time="2025-03-25T22:25:48+08:00" level=info msg="RTMP Listen On :1935"
time="2025-03-25T22:25:48+08:00" level=info msg="HTTP-API listen On :8090"
time="2025-03-25T22:25:48+08:00" level=info msg="HTTP-FLV listen On :7001"
time="2025-03-25T22:25:48+08:00" level=info msg="HLS listen On :7002"
time="2025-03-25T23:30:40+08:00" level=warning msg="[<key: live/movie, URL: /live/movie.flv, UID: Lg1MYudHQhK3ugtm, Inter: true>] packet queue max!!!"
(省略34条packet queue max!!!)
time="2025-03-25T23:38:42+08:00" level=warning msg="[<key: live/movie, URL: /live/movie.flv, UID: Lg1MYudHQhK3ugtm, Inter: true>] packet queue max!!!"
time="2025-03-25T23:38:45+08:00" level=info msg="write timeout remove"
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0x63aaa5]

goroutine 264 [running]:
bufio.(*Writer).Flush(0xc0001e0f80)
	/usr/lib/golang/src/bufio/bufio.go:639 +0x45
bufio.(*Writer).Write(0xc0001e0f80, {0xc0008fdcdf?, 0x7bd6a0?, 0x1?})
	/usr/lib/golang/src/bufio/bufio.go:683 +0xcd
net/http.(*response).write(0xc0001d61c0, 0x27d, {0xc0008fdcdf, 0x27d, 0x67321}, {0x0, 0x0})
	/usr/lib/golang/src/net/http/server.go:1658 +0x2fe
net/http.(*response).Write(0xc0001540d0?, {0xc0008fdcdf?, 0x7ce46?, 0x3?})
	/usr/lib/golang/src/net/http/server.go:1616 +0x2a
github.com/gwuhaolin/livego/protocol/httpflv.(*FLVWriter).SendPacket(0xc0001540c0)
	/root/testzhibo/livego/protocol/httpflv/writer.go:151 +0x1c8
github.com/gwuhaolin/livego/protocol/httpflv.NewFLVWriter.func1()
	/root/testzhibo/livego/protocol/httpflv/writer.go:55 +0x25
created by github.com/gwuhaolin/livego/protocol/httpflv.NewFLVWriter in goroutine 275
	/root/testzhibo/livego/protocol/httpflv/writer.go:54 +0x3dc

错误原因分析

直播服务器在2025年3月25日23时38分发生严重崩溃。系统在处理视频流推送时,出现内存地址异常导致程序中止。事件起源于视频数据包队列积压超过警戒线,触发紧急丢包机制。

系统在处理"live/movie"频道的FLV直播流时,客户端通过/live/movie.flv拉流。当数据队列达到1024上限后,系统在保留关键帧和音频的同时持续丢弃普通视频帧达3秒,期间突发致命崩溃。

崩溃源于无效内存访问:底层网络组件在通过HTTP发送缓存数据时异常失效。日志显示此时bufio.Writer内部状态已损坏,执行数据刷新操作时因空指针错误导致系统崩溃。

该问题暴露三处缺陷:

--1.客户端断开后未及时终止数据推送
--2.队列关闭后仍有协程进行读写操作
--3.失效网络组件仍被调用且无内存监控

系统因核心模块访问无效内存崩溃,同时暴露高并发场景下连接管理及异常处理机制存在漏洞,最终导致直播中断。

解决方案:

--1.资源管理锁:新增互斥锁保护流处理结构体,关闭操作前强制加锁,新增IsClosed状态检测方法
--2.智能超时控制:数据清理环节设置强制超时机制,规避流量突增导致的阻塞
--3.双重关闭保障:发送数据时同步监听关闭信号通道,增加网络连接实时检测,实现异常即时熔断
--4.标准化关闭流程:三步安全退出:加锁→关闭通道→标记终止状态,避免重复关闭风险

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions