【Linux】如何获取打开文件和文件描述符数量
linux 的文件描述符
文件描述符(FD:file descriptors),也可以说是文件句柄,当某个程序打开文件时,内核返回相应的文件描述符,程序为了处理该文件必须引用此描述符。文件描述符是一个正整数,用以标明每一个被进程所打开的文件和 socket。最前面的三个文件描述符(0,1,2)分别与标准输入(stdin),标准输出(stdout)和标准错误(stderr)对应,后面打开的文件依此类推对应 3、4…… 。
linux 系统对每个用户、进程、或整个系统的可打开文件描述符数量都有一个限制,一般默认为 1024。当我们在系统或应用的日志中碰到“too many open files”错误记录时,这个其实不是说打开的文件过多,而是打开的文件描述符数量已达到了限制,这时就需要增加文件描述符的数量限制了。
【Linux】顺序写盘和随机写盘
linux 的文件描述符
文件描述符(FD:file descriptors),也可以说是文件句柄,当某个程序打开文件时,内核返回相应的文件描述符,程序为了处理该文件必须引用此描述符。文件描述符是一个正整数,用以标明每一个被进程所打开的文件和 socket。最前面的三个文件描述符(0,1,2)分别与标准输入(stdin),标准输出(stdout)和标准错误(stderr)对应,后面打开的文件依此类推对应 3、4…… 。
linux 系统对每个用户、进程、或整个系统的可打开文件描述符数量都有一个限制,一般默认为 1024。当我们在系统或应用的日志中碰到“too many open files”错误记录时,这个其实不是说打开的文件过多,而是打开的文件描述符数量已达到了限制,这时就需要增加文件描述符的数量限制了。
【数据库开发知识】B+树
【数据库开发知识】基于B+树实现一个高并发数据库
开发笔记
1 |
|
我们看到 BPTNode
是我们的节点结构体,这个结构体占用的内存大小我们计算一下:
记住内存对齐的原则,并且指针占用 8 个字节,off_t 一般是 64 位,占用 8 个字节
1 | 4(int)+4(int)+4(KeyType)*4(M+1)+4(*pts)*4(M+1)+4(*next)+8(Record)*4(M+1) = 4+4+16+32+8+32 = 96bytes |
【消息队列】- kafka-swoole
前言
目前 kafka 客户端在 php 中比较出名的仅有 2 个,这 2 个项目都有各自的利弊。在这里我选择几个来列一下
- weiboad/kafka-php
- 协议非结构化封装,自定义性较强,不好维护
- 目前的 API 在消费者中由于单例设计的原因,不允许在消费者中生产消息
- 不支持多种压缩协议
- 单进程“协程式”逻辑,数据未实现分离,容易堵塞消费
- arnaud-lb/php-rdkafka
- 协议非结构化封装,自定义性较强,不好维护
- 不支持多种压缩协议
- 利用多线程,但是 PHP 对多线程对支持并不友好,相对于用 swoole 而言,劣势较为明显,容易出 bug,且维护性不高
基于以上几点,我们在基于swoole-4.3
以上重新开发了kafka-swoole
项目,优点如下:
- 多进程多核处理
- 支持 kafka 多个 sink 方式,实现拉取 kafka 数据和业务逻辑分离,从而不堵塞数据拉取
- 首个支持多种压缩方式(normal(不压缩)/gzip/snappy)的 php 客户端,从而在大吞吐对情况下减少带宽占用,提高传输速率
- 协议封装采用 OOP 的方式,结构化了协议的封装,利于维护和封装,对协议利用反射来统一封包和解包
- 利用协程来实现单个进程中对异步逻辑处理
- 提供了 runtime 的 rpc 命令,实时获取 kafka 成员进程对内部数据,实时查看消费情况
- 提供了 kafka 命令,方便获取 kafka 服务相关信息和 kafka 相关操作
- 在成员进程挂掉的情况下,记录错误信息,自动拉起。
- 对于常驻进程,不排除业务逻辑写出了内存泄漏的情况,所以所有的子进程都带有内存临界值重启机制来释放内存
- 主进程退出的情况下,发起了
离开消费者组
的请求,使得 kafka 能快速响应消费者组最新状态,从而更好平滑重新加入消费者
【消息队列】- Kafka相关
【大数据】- Glow 源码剖析
前言
犹豫公司的流式计算,并没有用类似于 Hadoop 的 mapreduce 机制或者 storm 或者 flink,是我们自研基于 erlang 的单节点服务,其优点就是:部署和迁移都十分简单,并且犹豫 erlang 的天然的良好的利用了多核 CPU 的优势,可以实现效率较高的大数据流式计算。但是由于其单机性,导致对单台机器的要求过于苛刻,并且不能进行扩展机器提高计算能力是其致命的缺点,所以目前我规划利用 golang,写一个支持分布式并行计算的服务,在此之前,了解了各大流式计算的基本思想,并且结合 golang 语言的特性,找到了一个叫glow
的服务,想要写好一个分布式流式计算的服务,我们先来看看 glow
有什么好的借鉴的思想和思路。