东风草堂blog

公众号:来风说


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

stun检查nat类型

发表于 2022-02-16 | 更新于: 2023-03-10 | 分类于 nat |
nat的四种类型是什么样的?怎么通过stun来探测当前网络处于哪一种nat类型后面?
阅读全文 »

rocksdb的基本原理以及应用

发表于 2022-02-12 | 更新于: 2023-03-06 |
rocksDB是什么?分布式领域的三架马车:GFS、BigTable、MapReduce。高效发挥存储硬件性能的嵌入式KV存储引擎,是facebook基于google的leveldb发展而来的。 rocksDB解决了什么问题?写多读少的场景需求,Mysql的InnoDb的B+树是为了解决读多写少的问题。 RockdsDB是怎么解决的?LSM-Tree不是一个数据结构(Log Structure Merge),是数据的一种组织形式。内存顺序IO(100ns)>>内存随机IO~=磁盘顺序IO>>磁盘随机IO(10ms),LSM是采用追加写,也就是顺序IO的方式。这样会造成数据冗余,如put(k1, v2),put(k2, v2),put(k1, v2),所以需要进行数据合并压缩,但是压缩的时候不能进行读写,为了尽可能的避免这种情况,需要对数据进行拆分,使影响的范围最小。数据是按照数据块的形式进行存储,为了让块内的数据达到有序,需要先在内存里面排序好,但是内存里面存放数据是不安全的,如果进行崩溃了,那这部分数据由于没有存放在磁盘就丢失了。所以这里需要有一个wal日志, ...
阅读全文 »

c++11新特性

发表于 2022-02-12 | 更新于: 2023-03-09 |
左值引用和右值引用的区别?右值引用的意义?左值引用是对左值的引用,右值引用是对右值的引用。功能差异:左值引用是为了避免对象拷贝,如函数传参、函数返回值。右值引用是为了实现移动语义和完美转发。怎么区分左值和右值?左值可以在等号的左边,可以取地址,具名,比如:变量名、返回左值引用的函数调用、前置自增自减、赋值运算或符号赋值运算、解引用。右值只能在等号的右边,不能取地址,不具名,右值有纯右值,比如字面值、返回非引用类型的函数调用、后置自增自减、算术逻辑比较表达式,右值还有将亡值,主要为C++11新引入的与右值引用(移动语义)相关的值类型,可以通过move把左值强制转换成将亡值,将亡值将用来触发移动构造或移动赋值构造,并进行资源转移,最后调用析构函数。const的左值引用可以指向右值,但不能修改这个值。右值引用可以通过std::move可以执行左值。声明出来的左值引用和右值引用都是左值。移动语义是为了对象赋值时,避免资源的重新分配,比如移动构造和移动拷贝构造,stl的unique_ptr也有用到。完美转发指的是,函数模板可以将自己的参数完美的转发给内部调用的其他函数,完美指的是不仅能转发参数 ...
阅读全文 »

mysql索引和事务原理

发表于 2022-02-12 | 更新于: 2023-03-20 |
初识mysql按照数据结构来组织、存储和管理数据的仓库。 OLTP(on-line transaction processing)联机事务处理,主要数据库增删改查。 OLAP(on-line analytical processing)联机分析处理,主要对数据库进行统计分析,为决策提供支持。SQL命令: DQL,数据查询语言,select DML(data manipulate language),数据操作语言,插入删除更新记录 DDL(data define language),数据定义语言,创建修改删除表 DCL(data control language),数据控制语言,授予用户权限、收回用户权限 TCL(transaction control language),事务控制语言,事务提交,事务回滚连接池模型:12345678select(listenfd+1, readfds, NULL, NULL, 0); // 一直阻塞。使用select,fd少,可以跨平台int clientfd = accept(listenfd, &addr, &len);mysql_ ...
阅读全文 »

gdb调试技巧

发表于 2022-02-07 | 更新于: 2023-03-03 |
如何生成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文件,需要在处理函数末尾做如下处理:12signal(signo, SIG_DFL); // 默认生成core文件kill(getpid(), signo); // signo为当前正在处理的信号类型 如果系统没有设置为unlimited,可以在程序中进行修改,这样只对本进程有效,修改完成后,可以在/proc/pid/limits查看。1234567#include <sys/resource.h>struct rlimi ...
阅读全文 »

miniupnp编译与使用

发表于 2022-02-06 | 更新于: 2023-03-14 |
ipv6相关的资料UPnP-gw-WANIPv6FirewallControl-v1-Service.pdf miniupnpd123# 开启debug模式,了解更加详细$ ./configure --ipv6 --debug$ make 配置文件如下,最后./miniupnpd -f miniupnpd.conf -d启动,-d可以看到输出的信息,程序中使用了syslog输出日志,相关日志可以在/var/log/messages查看。123456789101112131415161718192021222324252627282930313233343536373839404142434445$ vim miniupnpd.conf# 具体内容如下ext_ifname=ens33listening_ip=ens33http_port=0ipv6_disable=yessecure_mode=nosystem_uptime=yesnotify_interval=60clean_ruleset_interval=600uuid=00000000-0000-0000-0000-000000 ...
阅读全文 »

musl+libunwind的堆栈获取方案

发表于 2022-02-02 | 更新于: 2023-02-13 |
背景musl静态链接后,通过_Unwind_Backtrace某些架构无法获取到堆栈信息了,如arm32的SIGSEGV,libbacktrace是对其进行封装,所以也是如此。 使用http://musl.cc/下载的静态编译工具+libunwind同样无法获取到堆栈信息。 需要加入libunwind库的方法解决,具体如下。 参考:https://cloud.tencent.com/developer/article/1173442https://github.com/boostorg/stacktracehttps://www.boost.org/doc/libs/develop/doc/html/stacktrace.htmlhttps://www.jianshu.com/p/58d32fbd8dfahttps://gcc.gnu.org/onlinedocs/gcc/Link-Options.htmlhttps://gitlab.alpinelinux.org/alpine/aports/-/blob/master/main/libunwind/musl-mips-fix.pat ...
阅读全文 »

nghttp2技术实现

发表于 2022-02-02 | 更新于: 2023-02-22 |
参考资料https://datatracker.ietf.org/doc/html/rfc7540https://www.nghttp2.org/documentation/ h2的优势: 性能更强:HTTP/2的多路复用技术,不仅可以减少连接次数,同时使用非阻塞I/O技术可以在一次握手过程中提高传输性能。 更强大的头部压缩:HTTP/2使用HPACK技术对头部信息进行压缩,可以有效减少传输的头部信息大小,从而节省带宽消耗。 服务端推送:服务器可提前将客户端可能需要的资源进行推送,从而可以减少客户端的重复请求,提升页面访问速度。 请求优先级:HTTP/2支持浏览器控制请求和响应的优先级,从而可以减少资源的加载时间。 更安全:HTTP/2默认使用HTTPS,可以有效防止中间人攻击,保障用户信息传输的安全性。 nghttp2 demo使用方法demo是使用的libevent框架进行网络收发的,不需要关注具体的网络细节处理,只需要处理好相对应的回调函数即可。 nghttp2 demo编译Makefile文件12345678910111213141516./configuremake -j ...
阅读全文 »

rpc框架使用

发表于 2022-02-01 | 更新于: 2023-02-13 |
连接池使用需要先构造连接池对象,并完成初始化,连接池可以连接多个rpc服务器,从连接池取连接时会随机取不同服务器的连接,达到负载均衡的效果。 下图中为连接池里面使用的装饰者模式uml类图,从连接池中拿出的ITransportWrapper连接被PoolingTransport装饰后,close功能是自动放回连接池中,而不是真正的close掉连接,同样的,FakeTransport装饰后,IsOpen总是返回true,因为它是一个假冒的连接 连接池连接状态变更图如下,首先打开一个连接,打开成功进入BUSY状态,失败则进入DEAD状态,如果BUSY状态的连接使用过程中出现异常,也会进入DEAD状态。 处于BUSY状态的连接正常运行完成后会被重新放回连接池中,状态变更为IDLE状态,后续可以从连接池中获取IDLE状态的连接来处理新的事务。 对于DEAD状态的连接,需要判断当前活跃连接个数,如果活跃连接已经大于minSize了,直接销毁该连接,变更为CLOSED状态。否则重新打开该连接,让其变更为IDLE状态以备使用,当然如果打开失败,该连接还是处于DEAD状态。 对于IDLE状态的连接,如 ...
阅读全文 »

rpc网络io模型

发表于 2022-02-01 | 更新于: 2023-02-13 |
网络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接收接收事务处理都在connection->transition()中进行,首先读取帧长度readWant_,然后根据帧长度调整调整readBuffer_堆区的大 ...
阅读全文 »
1…345…14
nephen

nephen

131 日志
16 分类
64 标签
GitHub E-Mail
友情链接
  • 新建留言板
  • 订阅号留言板(旧)
  • 订阅号留言板(新)
  • 山楂岛秘密花园
  • 代发短信
© 2016 — 2023 nephen
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4
粤ICP备2022125614号-1
本站访客数 人次 本站总访问量 次