zlmediakit 在 aarch64 编译 遇到 Segmentation fault（核心已转储）
> 系统版本：openEuler 24.03 (LTS-SP1) aarch64 > 前提 在安装流程编译完zlmediakit 之后运行 .\MediaServer.exe -d 提示 Segmentation fault（核心已转储） 提示 Segmentation fault（核心已转储） 后面开始排查： #### 1. 开启 core dump ulimit -c unlimited #### 2. 查看 core 生成方式 cat /proc/sys/kernel/core_pattern #### 3. 前台运行看日志 ./MediaServer #### 4. 若有 core 文件 gdb ./MediaServer core #### 5. 若用 systemd-coredump coredumpctl list coredumpctl debug ./MediaServer ###交给模型分析 ```shell [root@service3 Debug]# coredumpctl debug 2601134 PID: 2601134 (MediaServer) UID: 0 (root) GID: 0 (root) Signal: 11 (SEGV) Timestamp: Tue 2025-12-23 09:17:45 CST (2min 34s ago) Command Line: ./MediaServer Executable: /www/spy/ZLMediaKit/release/linux/Debug/MediaServer Control Group: /user.slice/user-0.slice/session-18053.scope Unit: session-18053.scope Slice: user-0.slice Session: 18053 Owner UID: 0 (root) Boot ID: 61b92c204f12426c963ee1299b6544e1 Machine ID: 718781f979de4f48b1806e83960ef003 Hostname: service3 Storage: /var/lib/systemd/coredump/core.MediaServer.0.61b92c204f12426c963ee1299b6544e1.2601134.1766452665000000.lz4 (present) Size on Disk: 290.0K Message: Process 2601134 (MediaServer) of user 0 dumped core. GNU gdb (GDB) openEuler 14.1-3.oe2403sp1 Copyright (C) 2023 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "aarch64-openEuler-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: . Find the GDB manual and other documentation resources online at: . For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from /www/spy/ZLMediaKit/release/linux/Debug/MediaServer... [New LWP 2601134] [Thread debugging using libthread_db enabled] Using host libthread_db library "/usr/lib64/libthread_db.so.1". Core was generated by `./MediaServer'. Program terminated with signal SIGSEGV, Segmentation fault. #0 extent_arena_get (extent=0xffffffff94407000) at include/jemalloc/internal/atomic.h:55 warning: 55 include/jemalloc/internal/atomic.h: No such file or directory Missing separate debuginfos, use: dnf debuginfo-install glibc-2.38-47.oe2403sp1.aarch64 libgcc-12.3.1-64.oe--Type for more, q to quit, c to continue without paging-- 2403sp1.aarch64 libstdc++-12.3.1-64.oe2403sp1.aarch64 openssl-libs-3.0.12-15.oe2403sp1.aarch64 zlib-1.2.13-4.oe2403sp1.aarch64 (gdb) bt #0 extent_arena_get (extent=0xffffffff94407000) at include/jemalloc/internal/atomic.h:55 #1 extent_can_coalesce (outer=0xffffffff94407000, inner=0xffff94407080, extents=, arena=0xffff94400980) at src/extent.c:1310 #2 extent_try_coalesce (tsdn=tsdn@entry=0xffff953897b0, arena=arena@entry=0xffff94400980, r_extent_hooks=r_extent_hooks@entry=0xffffe074dc08, rtree_ctx=rtree_ctx@entry=0xffff953897d0, extents=extents@entry=0xffff944033c8, extent=extent@entry=0xffff94407080, coalesced=coalesced@entry=0x0, growing_retained=) at src/extent.c:1401 #3 0x0000ffff9511238c in extent_record (tsdn=tsdn@entry=0xffff953897b0, arena=arena@entry=0xffff94400980, r_extent_hooks=r_extent_hooks@entry=0xffffe074dc08, extents=extents@entry=0xffff944033c8, extent=0xffff94407080, growing_retained=true) at src/extent.c:1448 #4 0x0000ffff95112b5c in extent_grow_retained (tsdn=tsdn@entry=0xffff953897b0, arena=arena@entry=0xffff94400980, r_extent_hooks=r_extent_hooks@entry=0xffffe074dc08, size=size@entry=28672, pad=pad@entry=4096, alignment=alignment@entry=64, slab=slab@entry=false, szind=szind@entry=39, zero=zero@entry=0xffffe074dc6f, commit=commit@entry=0xffffe074dc07) at src/extent.c:1145 #5 0x0000ffff9511412c in extent_alloc_retained (commit=0xffffe074dc07, zero=0xffffe074dc6f, szind=39, slab=false, alignment=64, pad=4096, size=28672, new_addr=0x0, r_extent_hooks=0xffffe074dc08, arena=0xffff94400980, tsdn=0xffff953897b0) at src/extent.c:1238 #6 je_extent_alloc_wrapper (tsdn=tsdn@entry=0xffff953897b0, arena=arena@entry=0xffff94400980, r_extent_hooks=r_extent_hooks@entry=0xffffe074dc08, new_addr=new_addr@entry=0x0, size=size@entry=28672, pad=pad@entry=4096, alignment=alignment@entry=64, slab=slab@entry=false, szind=szind@entry=39, zero=zero@entry=0xffffe074dc6f, commit=commit@entry=0xffffe074dc07) --Type for more, q to quit, c to continue without paging-- at src/extent.c:1296 #7 0x0000ffff950f2758 in je_arena_extent_alloc_large (tsdn=tsdn@entry=0xffff953897b0, arena=arena@entry=0xffff94400980, usize=usize@entry=28672, alignment=64, zero=zero@entry=0xffffe074dc6f) at src/arena.c:527 #8 0x0000ffff95115d04 in je_large_palloc (tsdn=0xffff953897b0, arena=, usize=28672, alignment=, zero=) at src/large.c:47 #9 0x0000ffff95124788 in ipallocztm (arena=, is_internal=true, tcache=0x0, zero=true, alignment=64, usize=, tsdn=0xffff953897b0) at include/jemalloc/internal/jemalloc_internal_inlines_c.h:58 #10 je_tsd_tcache_data_init (tsd=tsd@entry=0xffff953897b0) at src/tcache.c:388 #11 0x0000ffff95124ee0 in je_tsd_tcache_enabled_data_init (tsd=tsd@entry=0xffff953897b0) at src/tcache.c:339 #12 0x0000ffff95125e5c in tsd_data_init (tsd=0xffff953897b0) at src/tsd.c:74 #13 je_tsd_fetch_slow (tsd=0xffff953897b0, minimal=) at src/tsd.c:121 #14 0x0000ffff95125fb0 in tsd_fetch_impl (minimal=false, init=true) at include/jemalloc/internal/tsd.h:263 #15 tsd_fetch () at include/jemalloc/internal/tsd.h:289 #16 je_malloc_tsd_boot0 () at src/tsd.c:256 #17 0x0000ffff950e8180 in malloc_init_hard () at src/jemalloc.c:1469 #18 0x0000ffff950e9740 in malloc_init () at src/jemalloc.c:216 #19 imalloc (dopts=, sopts=) at src/jemalloc.c:1927 #20 malloc (size=72704) at src/jemalloc.c:1977 #21 0x0000ffff94a5ea08 in ?? () from /usr/lib64/libstdc++.so.6 #22 0x0000ffff9536a65c in ?? () from /lib/ld-linux-aarch64.so.1 --Type for more, q to quit, c to continue without paging--info registers #23 0x0000ffff9536a754 in ?? () from /lib/ld-linux-aarch64.so.1 #24 0x0000ffff9537f4b8 in ?? () from /lib/ld-linux-aarch64.so.1 (gdb) info registers x0 0xffffffff94407000 -1807716352 x1 0x0 0 x2 0x0 0 x3 0x20d565b2bf87ea62 2365908997645003362 x4 0xffff95389760 281473185257312 x5 0x1490 5264 x6 0xea46c429a730de46 -1565348137286967738 x7 0x1377330e14c12fe2 1402645944519962594 x8 0x20d565b2afed58bb 2365908997383215291 x9 0x178 376 x10 0xffbb60f9eee728a1 -19315146821785439 x11 0xea46c429d213bc52 -1565348136567456686 x12 0xffbb60f9913a98dd -19315148393375523 x13 0x0 0 x14 0x0 0 x15 0x1 1 x16 0x1 1 x17 0x27ffff94407000 11258997260709888 x18 0x465bceb23a17cff9 5069873070409764857 x19 0xffff94407080 281473168994432 x20 0xffff944033c8 281473168978888 x21 0xffff953897b0 281473185257392 x22 0x0 0 --Type for more, q to quit, c to continue without paging-- x23 0xc4ceb9fe1a85ec53 -4265267296055464877 x24 0xff51afd7ed558ccd -49064778989728563 x25 0xffff953897d0 281473185257424 x26 0xffff94400980 281473168968064 x27 0xffffffff94407000 -1807716352 x28 0xffff95150500 281473182926080 x29 0xffffe074d640 281474447496768 x30 0xffff95111ef8 281473182670584 sp 0xffffe074d640 0xffffe074d640 pc 0xffff95111f00 0xffff95111f00 cpsr 0x60001000 [ EL=0 BTYPE=0 SSBS C Z ] fpsr 0x0 [ ] fpcr 0x0 [ Len=0 Stride=0 RMode=0 ] tpidr 0xffff95389760 0xffff95389760 tpidr2 0x0 0x0 (gdb) ``` ### 初步判断是： > ZLMediaKit 静态链接了 jemalloc，但与 openEuler 24.03 的 glibc 或内核存在兼容性问题 ZLMediaKit 默认会 内置编译并链接自己的 jemalloc（位于 3rdpart/jemalloc 子模块） 而 openEuler 24.03 使用较新的 glibc 2.38 + 内核 6.x，对内存布局、ASLR、指针加密（PAC）等有更严格要求 旧版 jemalloc（尤其是 ZLMediaKit 自带的版本）在 aarch64 + 新系统上可能因指针对齐、原子操作或虚拟地址假设错误而崩溃 #### 解决方法： > 修改 CMakeLists.txt 强制跳过 jemalloc 编辑 /ZLMediaKit/CMakeLists.txt，找到类似这段代码 ```shell find_library(JEMALLOC_LIBRARIES NAMES jemalloc) if(JEMALLOC_LIBRARIES) message(STATUS "found library: ${JEMALLOC_LIBRARIES}") message(STATUS "jemalloc will be used to avoid memory fragmentation") target_link_libraries(${PROJECT_NAME} PRIVATE ${JEMALLOC_LIBRARIES}) endif() ``` #### 注释掉或删除整个 if(JEMALLOC_LIBRARIES) 块： ```shell # find_library(JEMALLOC_LIBRARIES NAMES jemalloc) # if(JEMALLOC_LIBRARIES) # message(STATUS "found library: ${JEMALLOC_LIBRARIES}") # message(STATUS "jemalloc will be used to avoid memory fragmentation") # target_link_libraries(${PROJECT_NAME} PRIVATE ${JEMALLOC_LIBRARIES}) # endif() ``` #### 然后重新 cmake + make。 重新编译之后可正常运行。
1.修改php.ini 添加配置 ```php [PHP_DM] extension =libphp80_dm extension = php80_pdo_dm [dm] dm.port=5237 ; ; 是否允许持久性连接 dm.allow_persistent = 1 ; ; 允许建立持久性连接的最大数. -1 为没有限制. dm.max_persistent = -1 ; ; 允许建立连接的最大数(包括持久性连接). -1 为没有限制. dm.max_links = -1 ; ; 默认的主机地址 dm.default_host = 0.0.0. ; ; 默认登录的数据库 dm.default_db = SYSTEM ; ; 默认的连接用户名 dm.default_user = SLT ; ; 默认的连接口令. dm.default_pw = 00000 ; ;连接超时，这个参数未实际的用到，等待服务器支持 dm.connect_timeout = 10 ; ;对于各种变长数据类型，每列最大读取的字节数。如果它设置为 0 或是小于 0,那么，读取变长字段时，将显示 NULL 值 dm.defaultlrl = 4096 ; ; 是否读取二进制类型数据，如果它设置为 0，那么二进制将被 NULL 值代替 dm.defaultbinmode = 1 ; ;是否允许检察持久性连接的有效性，如果设置为 ON，那么当重用一个持久性连接时，会检察该连接是否还有效 dm.check_persistent = ON ``` ### 驱动下载 #### 从CentOS 8.5.2111 aarch64 提取 [php_pdo_ftEPY.zip](https://cnd.haser.top/haser.top/2025/11/19/4261157564.zip) #### 从官网下载 [达梦产品下载](https://eco.dameng.com/download/ "达梦产品下载") > 如果是数据库一个服务器一个是web服务器，遇到问题可以把数据库服务器的达梦安装目录的bin文件夹拷贝到web服务器中，然后写到系统变量中 在web服务器中（/home/dmdbms/bin 是已经拷贝到从数据库服务器中拷贝到web服务器中的文件夹） ```shell export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/dmdbms/bin source ~/.bashrc ``` 1.PHP message: PHP Fatal error: Unable to start DM module in Unknown on line 0 【问题解决】 达梦数据库安装的目录 bin 文件夹下的 libdmdpi.so 文件放入 /usr/lib 或者 /usr/lib64/ 目录里即可解决。(我是放在lib64目录之后才不报错的) 官方文档:[常见问题](https://eco.dameng.com/document/dm/zh-cn/faq/faq-php-new.html "常见问题")
**主从配置需要注意的点** 1.主从服务器操作系统版本和位数一致； 2.Master 和 Slave 数据库的版本要一致； 3.Master 和 Slave 数据库中的数据要一致； ### 1.在主服务器的上修改mysql配置文件 my.ini [mysqld] expire_logs_days = 10 log-bin=mysql-bin server-id = 1 #设置需要同步的数据库 binlog-do-db=mwryun_db #屏蔽系统库同步 binlog-ignore-db=mysql binlog-ignore-db=information_schema binlog-ignore-db=performance_schema log-bin:开启二进制日志 server-id：服务器id，要唯一 主服务器配置完成之后进行重启 然后执行查询语句 show MASTER status 有这些数据说明服务正常，**并保存 file和 position** ，后面会用到。 ![微信图片_20230505162517.png](https://cnd.haser.top/haser.top/2023/05/05/624981306.png) ### 2.配置从服务器，同样的修改mysql配置文件 my.ini [mysqld] server-id=2 从服务器配置server-id之后重启，连接数据库，执行以下语句 ```sql CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.****',--刚刚查询的file MASTER_LOG_POS=0001,-- 刚刚查询的position MASTER_HOST='127.0.0.1',--主服务器ip MASTER_USER='root',--主服务器用户名 MASTER_PASSWORD='root',--主服务器密码 MASTER_PORT=3306;--主服务器端口 START SLAVE;--启动 show slave status;--最后查询状态 ``` 当这两个全部为 yes 时即配置完成。 ![微信截图_20230505163027.png](https://cnd.haser.top/haser.top/2023/05/05/860810160.png)
### 如果想在GitHub上上传您在IntelliJ IDEA中编写的代码，需要执行以下步骤： #### 1.在IntelliJ IDEA中打开您要上传的项目。 #### 2.在IntelliJ IDEA的菜单栏中选择“VCS”，然后选择“Import into Version Control”，然后选择“Create Git Repository”。3.这会在您的项目文件夹中创建一个Git存储库。 #### 4.转到GitHub，登录您的帐户并创建一个新存储库。 #### 5.在IntelliJ IDEA中，右键单击您的项目并选择“Git”，然后选择“Push”。 #### 6.在弹出的窗口中，输入您在GitHub上创建的存储库的URL，然后单击“Push”按钮。 #### 7这样，您就可以将您在IntelliJ IDEA中编写的代码上传到GitHub上了。 ### 如果已经在GitHub上创建了存储库，可以执行以下步骤将在IntelliJ IDEA中编写的代码上传到GitHub上： #### 1.在IntelliJ IDEA中打开您要上传的项目。 #### 2.在IntelliJ IDEA的菜单栏中选择“VCS”，然后选择“Import into Version Control”，然后选择“Create Git Repository”。这会在您的项目文件夹中创建一个Git存储库。 #### 3.在IntelliJ IDEA中，右键单击您的项目并选择“Git”，然后选择“Remote”，然后选择“Push”。 #### 4.在弹出的窗口中，输入您在GitHub上创建的存储库的URL，然后单击“Push”按钮。 来源：OpenAI
# 缓存雪崩 在**高并发下**，大量缓存**key在同一时间失效**，大量请求直接落在数据库上，导致数据库宕机。 ## 解决方案 • 随机设置key失效时间，避免大量key集体失效。 setRedis（Key，value，time + Math.random() * 10000）； 复制代码 • 若是集群部署，可将热点数据均匀分布在不同的Redis库中也能够避免key全部失效问题 • 不设置过期时间 • 跑定时任务，在缓存失效前刷进新的缓存 # 缓存穿透 不断地访问redis和数据库里**没有的数据**, 比如用户id从1开始,攻击请求不断地请求 -1 这个数据,因为redis没有这个缓存**只能不断地去数据库查询** ,最终导致数据库压力过大宕机 ## 解决方案 对不存在的数据缓存到redis中，设置key，value值为null(不管是数据未null还是系统bug问题)，并设置一个短期过期时间段，避免过期时间过长影响正常用户使用。 拉黑该IP地址 对参数进行校验，不合法参数进行拦截 布隆过滤器 将所有可能存在的数据哈希到一个足够大的bitmap(位图)中，一个一定不存在的数据会被 这个bitmap拦截掉，从而避免了对底层存储系统的查询压力。 # 缓存击穿 **热点数据在高并发**,但是在**一瞬间key过期**,导致之后的请求**全部需要查询数据库**,导致数据库压力过大,最终宕 ## 解决方案 设置热点数据"永不过期" 加上互斥锁：上面的现象是多个线程同时去查询数据库的这条数据，那么我们可以在第一个查询数据的请求上使用一个互斥锁来锁住它 其他的线程走到这一步拿不到锁就等着，等第一个线程查询到了数据，然后将数据放到redis缓存起来。后面的线程进来发现已经有缓存了，就直接走缓存
## 文档目录： ![](https://cnd.haser.top/2020/06/26/3763354277.png) ------------ [scode type="green"]具体是干什么的大家应该都知道，我就不详细说了，点击下方按钮进行下载！[/scode] [button url="http://cloud.haser.top/#/s/nmSG" color="success" icon="glyphicon glyphicon-arrow-down"]下载帮助文档[/button]
[scode type="green"]HAS的日记 主要维护业务[/scode] [button type="round" color="danger" url="https://haser.top/ "]点击跳转[/button] [scode type="green"]HAS的日记 微信公众号平台[/scode] [button type="round" color="danger" url="https://cnd.haser.top/2019/11/14/5bf5793535615.png "]扫码关注[/button] ------------ [scode type="green"]HAS项目文档[/scode] [button type="round" color="danger" url="https://document.haser.top/ "]点击跳转[/button] ------------ [scode type="green"]HAS Api平台 可能停止维护[/scode] [button type="round" color="danger" url="https://api.haser.top/ "]点击跳转[/button] ------------ [scode type="green"]HAS的图床\网盘[/scode] [button type="round" color="danger" url="http://img.haser.top/ "]点击跳转[/button] ------------ [scode type="green"]资源整合 精简版[/scode] [button type="round" color="danger" url="https://haser.top/independent/resources/ "]点击跳转[/button] ------------ [scode type="green"]HASPassword 维护地址[/scode] [button type="round" color="danger" url="https://blog.haser.top/ "]点击跳转[/button]