作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!


接上一篇:fasthttp 中如何使用Transfer-Encoding: chunked 方式的流式内容输出

首先是找了一个库,封装了 linux 下的 sendfile 系统调用:github.com/hslam/sendfile

上代码:

  • go.mod 中:
replace (
github.com/valyala/fasthttp => github.com/ahfuzhang/compress v1.49.2
)
package main

import (
"bufio"
"bytes"
"fmt"
"io"
syslog "log"
"net"
"os"
"strconv"
"time" "github.com/hslam/sendfile"
"github.com/valyala/bytebufferpool"
"github.com/valyala/fasthttp"
) var fileToSend *os.File
var fileSize int64 func FasthttpHandler(ctx *fasthttp.RequestCtx) {
ctx.HijackSetNoResponse(true) // 不使用 fasthttp 框架的输出
//ctx.Hijack(func(c net.Conn) { // 这里会 go 出来一个协程执行 hijack 回调函数。 我改了一个版本,不配置就不会 go 出来协程
// log.Println("do nothing")
//})
//
buf := bytebufferpool.Get()
defer bytebufferpool.Put(buf)
buf.Reset()
buf.B = append(buf.B, "HTTP/1.1 200 OK\r\n"+
"Server: fasthttp\r\n"+
"Date: Thu, 26 Oct 2023 01:09:23 GMT\r\n"+
"Content-Type: text/plain\r\n"+
"Cache-Control: no-cache, no-store, must-revalidate\r\n"+
"Transfer-Encoding: chunked\r\n"+
"\r\n"...)
conn := ctx.Conn()
_, _ = conn.Write(buf.B) // 写 http 头
//
for i := 0; i < 9; i++ {
_, _ = conn.Write([]byte(fmt.Sprintf("%x\r\n%d \r\n", 1, i)))
}
//
_, _ = conn.Write([]byte(fmt.Sprintf("%x\r\n", fileSize, i)))
n, err := sendfile.SendFile(ctx.Conn(), int(fileToSend.Fd()), 0, fileSize) // 使用系统调用
if err != nil {
syslog.Fatalln(err)
}
_, _ = conn.Write([]byte("\r\n"))
syslog.Println("send count:", n)
// 写入结束信息
_, _ = conn.Write([]byte("0\r\n\r\n")
} func main() {
fileToSend, _ = os.Open("xxxx.file")
fileSize = 1024*2
//
syslog.SetFlags(syslog.Lshortfile | syslog.LstdFlags)
server := &fasthttp.Server{
Handler: FasthttpHandler,
}
syslog.Fatalln(server.ListenAndServe(":8089"))
}

相比直接从内存中 send 数据,实际测试中并未发现明显的性能提升,也可能是我只使用了 2kb 的数据,差异不明显。

希望对大家有用, have fun

fasthttp 中如何使用 linux 系统调用 `sendfile`的更多相关文章

  1. linux内核系统调用--sendfile函数

    在apache,nginx,lighttpd等webserver其中,都有一项sendfile相关的配置,在一些网上的资料都有谈到sendfile会提升文件传输性能,那sendfile究竟是什么呢?它 ...

  2. 如何在Linux中添加新的系统调用

    系统调用是应用程序和操作系统内核之间的功能接口.其主要目的是使得用户 可以使用操作系统提供的有关设备管理.输入/输入系统.文件系统和进程控制. 通信以及存储管理等方面的功能,而不必了解系统程序的内部结 ...

  3. [Linux]Linux系统调用列表

    本文列出了大部分常见的Linux系统调用,并附有简要中文说明. 以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的 ...

  4. 常用的Linux系统调用命令

    常用的Linux系统调用命令   下面一些函数已经过时,被新的更好的函数所代替了(gcc在链接这些函数时会发出警告),但因为兼容的原因还保留着,这些函数将在前面标上“*”号以示区别.   一.进程控制 ...

  5. Linux系统调用(转载)

    目录: 1. Linux系统调用原理 2. 系统调用的实现 3. Linux系统调用分类及列表 4.系统调用.用户编程接口(API).系统命令和内核函数的关系 5. Linux系统调用实例 6. Li ...

  6. Linux系统调用列表

    转自Linux系统调用列表 一.进程控制: fork 创建一个新进程 clone 按指定条件创建子进程 execve 运行可执行文件 exit 中止进程 _exit 立即中止当前进程 getdtabl ...

  7. UNIX环境高级编程——Linux系统调用列表

    以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完 ...

  8. Linux系统调用列表(转)

    以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数.这可能是你在互联网上所能看到的唯一一篇中文注释的Linux系统调用列表,即使是简单的字母序英文列表,能做到这么完 ...

  9. linux内核剖析(六)Linux系统调用详解(实现机制分析)

    本文介绍了系统调用的一些实现细节.首先分析了系统调用的意义,它们与库函数和应用程序接口(API)有怎样的关系.然后,我们考察了Linux内核如何实现系统调用,以及执行系统调用的连锁反应:陷入内核,传递 ...

  10. 网络常用的linux系统调用

    网络之常用的Linux系统调用 下面一些函数已经过时,被新的更好的函数所代替了(gcc在链接这些函数时会发出警告),但因为兼容的原因还保留着,这些函数将在前面标上“*”号以示区别. 一.进程控制 fo ...

随机推荐

  1. 利用Appuploader上架IPA步骤

      Appuploader可以辅助在Windows.linux或mac系统直接申请iOS证书p12,及上传ipa到App Store.方便在没有苹果电脑情况下上架IPA操作. 一.下载安装iOS上架辅 ...

  2. 企业需要知道的5个 IAM 最佳实践

    在之前的文章中,我们了解了在代码发布到 GitHub 之前如何管理用户权限.但你知道吗?人为错误竟然是迄今为止数据泄露的主要原因!根据统计,高达95%的数据泄露是由配置错误和不良网络环境引起的.黑客通 ...

  3. DataLeap的全链路智能监控报警实践(二):概念介绍

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 概念介绍 基线监控 根据监控规则和任务运行情况,DataLeap的基线监控能够决策是否报警.何时报警.如何报警以及 ...

  4. Nacos 1.2.1 集群搭建(一)环境准备

    虚机准备.Nacos 文件准备.MySQL 5.7 安装 https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html 根据官网要求,至少3个节点 ...

  5. Spring Boot CMD 运行日志输出中文乱码

    Spring Boot 在Windows CMD 中运行,日志输出中文乱码name="CONSOLE" 设置成 charset utf-8 ,在windows cmd 中运行时,l ...

  6. Educational Codeforces Round 106 (Rated for Div. 2) 简单题解(A~C)

    1499A. Domino on Windowsill 题意:给定一个 \(2 \times n\) 的空间,\(k1.k2 行要设置为白色(2 \times 1)\) 然后其他的设置为黑色 思路:为 ...

  7. 反应式编程 RxJava 设计原理解析

    本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/duO1pAfaKUI2_x_GVvZHMg作者:Yunjie Ma 一.ReactiveX ...

  8. 师爷,翻译翻译什么叫AOP

    张麻子:汤师爷,翻译翻译,什么叫AOP? 汤师爷:这还用翻译. 张麻子:我让你翻译给我听,什么叫AOP? 汤师爷:不用翻译,切面编程就是AOP啊. 黄四郎:难道你听不懂什么叫AOP? 张麻子:我就想让 ...

  9. 与奥运同行:打造智慧体育馆 3D 可视化

    祝贺中国队在东京奥运会夺得金牌 38 枚.银牌 32 枚.铜牌 18 枚.中国健儿在奥运舞台上交出了一份璀璨的成绩单.用一场场精彩绝伦的比赛,演绎"更快.更高.更强.更团结"的奥林 ...

  10. Vue 大屏可视化 铺满全屏

    https://blog.csdn.net/u011097323/article/details/106728221?utm_medium=distribute.pc_aggpage_search_r ...