东风草堂博客

公众号:开发者来风

如何生成core文件

系统ulimit -c大于0,一般设为unlimited,进程接收到异常信号后,默认是生成core文件,如果/proc/sys/kernel/core_pattern为core,则文件生成在进程的getcwd工作目录,如果/proc/sys/kernel/core_uses_pid为1,则core文件以pid结尾。

对于正在运行的进程,如果不想让进程退出,可以用gcore pid生成该进程的core文件。

对于代码中有对异常信号进行处理的情况,则接收到异常信号时,进入自定义的信号处理函数中,不再生成core文件,此时如果还想生成core文件,需要在处理函数末尾做如下处理:

1
2
signal(signo, SIG_DFL); // 默认生成core文件
kill(getpid(), signo); // signo为当前正在处理的信号类型
阅读全文 »

详细介绍miniupnp库的编译安装和使用方法,包括libminiupnpc客户端库的核心功能、端口映射配置技巧、NAT穿透实现原理。通过实际代码示例演示如何利用miniupnp实现自动端口转发,解决P2P应用中的内网访问问题,提升网络应用的连通性。

阅读全文 »

背景

musl静态链接后,通过_Unwind_Backtrace某些架构无法获取到堆栈信息了,如arm32的SIGSEGV,libbacktrace是对其进行封装,所以也是如此。

使用http://musl.cc/下载的静态编译工具+libunwind同样无法获取到堆栈信息。

需要加入libunwind库的方法解决,具体如下。

参考:
https://cloud.tencent.com/developer/article/1173442
https://github.com/boostorg/stacktrace
https://www.boost.org/doc/libs/develop/doc/html/stacktrace.html
https://www.jianshu.com/p/58d32fbd8dfa
https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html
https://gitlab.alpinelinux.org/alpine/aports/-/blob/master/main/libunwind/musl-mips-fix.patch

阅读全文 »

参考资料

https://datatracker.ietf.org/doc/html/rfc7540
https://www.nghttp2.org/documentation/

h2的优势:

  1. 性能更强:HTTP/2的多路复用技术,不仅可以减少连接次数,同时使用非阻塞I/O技术可以在一次握手过程中提高传输性能。
  2. 更强大的头部压缩:HTTP/2使用HPACK技术对头部信息进行压缩,可以有效减少传输的头部信息大小,从而节省带宽消耗。
  3. 服务端推送:服务器可提前将客户端可能需要的资源进行推送,从而可以减少客户端的重复请求,提升页面访问速度。
  4. 请求优先级:HTTP/2支持浏览器控制请求和响应的优先级,从而可以减少资源的加载时间。
  5. 更安全:HTTP/2默认使用HTTPS,可以有效防止中间人攻击,保障用户信息传输的安全性。

nghttp2 demo使用方法

阅读全文 »

连接池使用

需要先构造连接池对象,并完成初始化,连接池可以连接多个rpc服务器,从连接池取连接时会随机取不同服务器的连接,达到负载均衡的效果。

下图中为连接池里面使用的装饰者模式uml类图,从连接池中拿出的ITransportWrapper连接被PoolingTransport装饰后,close功能是自动放回连接池中,而不是真正的close掉连接,同样的,FakeTransport装饰后,IsOpen总是返回true,因为它是一个假冒的连接

连接池连接状态变更图如下,首先打开一个连接,打开成功进入BUSY状态,失败则进入DEAD状态,如果BUSY状态的连接使用过程中出现异常,也会进入DEAD状态。

阅读全文 »

网络IO主流程

TNonblockingServer使用的网络io模型为非阻塞同步io模型,accept由单个io线程处理,recv由多个io线程处理,相应的rpc事务处理由另外的线程池完成,处理完成后通知对应的io线程将处理结果进行send。

accept连接

所有网络连接由ioThreads_[0]线程监听端口,在listenHandler中处理,accept后生成一个clientConnection,如果存在多个io线程,ioThreads_[0]线程通过robin算法从所有ioThreads_中选择一个io线程处理事务,即ioThreads_[0]通过pipe管道将clientConnection信息通知被选择的io线程,被选择的io线程此时会收到通知并处理notifyHandler,被选择的io线程在notifyHandler中将clientConnection信息读取出来,再进行recv数据并解析处理。

recv接收

阅读全文 »

golang使用起来总体感觉比较方便,里面很多思想都是相同的,学习过c/c++的朋友就很容易理解,封装继承多态都差不多,对异常处理有一些不一样,和java比较类似。

阅读全文 »

两种nlogn时间复杂度的排序算法,一个归并排序,一个快速排序。归并排序和快速排序都采用了分治的思想来解决排序的问题,将大问题转化为小问题进行处理,归并排序是由下到上,先划分子问题到不能再划分的地步,再进行合并操作,而快速排序是先分区排序,将分区点放在最终排好序的位置,然后对分区点两边的子数组再进行分区排序处理,所以快排是由上到下进行处理的。归并排序和原始数组的有序程度无关,时间复杂度都是nlogn,但是空间复杂度为O(n),而快速排序大部分情况下的时间复杂度可以做到nlogn,但也有极端情况退化为n^2,另外归并排序是稳定的排序算法,但快排不是,只是快排可以原地排序,空间复杂度为O(1),所以实际使用过程中,还是快排用的比较广泛。

阅读全文 »

冒泡排序、插入排序和选择排序介绍,各有什么优缺点,这三个排序算法最坏时间复杂度都达到了n^2,根据排序效率,是否稳定排序等方面来考虑,优先选择插入排序。

阅读全文 »
0%