数据的接收 Table of Contents 数据的接收 过程概述 硬中断处理 软中断处理 链路层 igb_clean_rx_irq() GRO(Generic Receive Offloading) napi_gro_receive() napi_skb_finish() gro_normal_one() __netif_receive_skb_core() deliver_skb() 网络层 ip_rcv() ip_rcv_finish() dst_input() ip_local_deliver() ip_protocol_deliver_rcu() 传输层 概述 tcp_v4_rcv() udp_rcv() tcp_recvmsg() udp_recvmsg() 系统调用 read() recv()与recvfrom() recvmsg() 套接口层 sock_recvmsg_nosec() inet_recvmsg() 参考 数据的接收 过程概述 说明: 本文使用6.5内核, 涉及网卡时使用intel igb。 数据包从外部网络进入网卡 网卡(通过DMA)将包拷贝到内核内存中的ring buffer 产生硬件中断,通知系统收到了一个包 驱动调用NAPI,如果轮询(poll)还没有开始,就开始轮询 ksoftirqd软中断调用NAPI的poll函数从ring buffer收包(poll函数是网卡驱动在初始化阶段注册的;每个cpu上都运行着一个ksoftirqd进程,在系统启动期间就注册了) ring buffer里面对应的内存区域解除映射(unmapped) 如果packet steering功能打开,或者网卡有多队列,网卡收到的数据包会被分发到多个cpu…
网络数据的发送
网络数据的发送 Table of Contents 网络数据的发送 过程概述 系统调用 概要 write() send()与sendto() sendmsg() 套接口层 sock_sendmsg_nosec() inet_sendmsg() 传输层 tcp_sendmsg() udp_sendmsg() 网络层 ip_local_out() dst_output() ip_output() ip_finish_output() ip_finish_output2() 邻居系统 neigh_output() struct neighbour的output函数指针 设备系统 dev_queue_xmit() __dev_xmit_skb __qdisc_run() dev_hard_start_xmit() 网卡驱动 igb_xmit_frame() igb_xmit_frame_ring() igb_tx_map() 发送完成 概要 硬中断处理 软中断处理 参考 网络数据的发送 过程概述 说明: 本文使用6.5内核, 涉及网卡时使用intel igb。 使用系统调用(write/send/sendto/sendmsg等)写数据 数据穿过socket子系统,进入socket协议族(protocol family)系统 协议族处理:数据穿过协议层,这一过程(在许多情况下)会将数据(data)转换成数据包(packet) 数据穿过路由层,这会涉及路由缓存和ARP缓存的更新;如果目的MAC不在ARP缓存表中,将触发一次ARP广播来查找MAC地址 穿过协议层,packet到达设备无关层(device agnostic layer)…
MySQL规范
MySQL-convention MySQL-convention orient version 1.0.1, 2022-01-04 12:37 Table of Contents 基础规范 命名规范 库表设计规范 列/字段设计规范 索引规范 SQL规范 操作规范 参考 基础规范 表存储引擎必须使用InnoDB 表字符集默认utf8mb4, 而不是utf8或其它 utf8mb4: A UTF-8 encoding of the Unicode character set using one to four bytes per character. utf8mb3: A UTF-8 encoding of the Unicode character set using one to three bytes per character. utf8:…
MongoDB规范
mongodb-convention mongodb-convention orient version 0.0.1 Table of Contents 基础规范 命名规范 库设计规范 连接规范 集合设计规范 文档/列/字段设计规范 索引规范 API/SQL规范 操作规范 参考 基础规范 【强制】禁止在线上环境做数据库压力测试 【强制】测试,开发,线上数据库环境必须隔离 【强制】设计前, 应该了解mongodb的一些限制, 参考https://docs.mongodb.com/manual/reference/limits/ 解读: 例如: 文档大小限制为16M; 例如: In the $lookup stage, the from collection cannot be sharded 参考: https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/index.html#sharded-collection-restrictions 命名规范 【强制】数据库名db_xxxx, 全部小写,禁止使用任何”_”(即下划线)以外的特殊字符,禁止使用数字打头的库名 【强制】数据库名最多为64个字符 【强制】集合名全部小写,禁止使用任何”_”(即下划线)以外的特殊字符,禁止使用数字/system打头的集合名 【强制】集合名称最多为64字符 【强制】集合中的key禁止使用任何”_”(即下划线)以外的特殊字符 【强制】文档中的字段名等均应尽量保持短小 库设计规范 【强制】在创建新的库前应尽量评估该库的体积、QPS等,提前与DBA讨论是应该新建一个库还是专门为该库创建一个新的集群 连接规范 【强制】正确连接副本集,副本集提供了数据的保护、高可用和灾难恢复的机制。如果主节点宕机,其中一个从节点会自动提升为从节点。 【建议】合理控制连接池的大小,限制连接数资源,可通过Connection String URL中的…
C++代码规范
说明 规范与建议以Google代码规范为基础, 以Effective系列等作为补充(去掉了重合的, 过时的, 基本可以省略的内容) Google代码规范的注释及格式等部分考虑使用cpplint工具来完成 版本: 1.0.0 最后更新: 2021-09-01 13:01 作者: orient 主页: http://orientye.com github: https://github.com/orientye 微信公众号: 深入理解计算机系统 Google代码规范 https://google.github.io/styleguide/cppguide.html 中文版: https://google-styleguide.readthedocs.io/zh_CN/latest/google-cpp-styleguide/contents.html (注意:有些并不准确) Effective C++ 3rd Item 04. 确定对象被使用前已被初始化 Item 07. 为多态基类声明virtual析构函数 Item 09. 绝不在构造函数和析构函数中调用virtual函数 Item 11. operator=处理好自我赋值 Item 12. 复制对象时勿忘其每一个成分 Item 16. 成对使用new和delete要采取相同形式 Item 21. 绝不返回局部变量(local stack)的指针或引用 Item 26. 尽可能延后变量定义的出现时间 Item 28. 避免返回handles(包括引用指针迭代器)指向对象内部…