webserver面试

1 难点

1.1 网络框架的选取

常见的有reactor和proactor,在linux中,异步io不完善,所以很多项目都采用reactor模式。我又参考了开源的项目,最终选择使用同步io模拟异步的模式。

1.2 RAII

参考开源项目,资源获取即初始化,任务执行之前获取数据库连接,执行完释放连接,对这个部分

的理解和使用是个难点。

1.3 项目优化

1.3.1 堆

使用小根堆代替开源项目中的list作为定时器的容器,使添加和修改定时器的时间复杂度从O(n)降至O(logn).

涉及到的函数有:添加、修改、删除、tick、上移、下移、交换定时器

这一块需要把堆排序掌握清楚,根据需要,写出自己的代码

1.3.2 sendfile

项目使用零拷贝技术优化文件传输。调用sendfile(),出现问题:

1.无法传输完整的图片

使用strerror(errno)输出错误,错误为Resource temporarily unavailable。

查询资料,这个错误表示  正在使用一个非阻塞的套接字,但是请求的操作会阻塞。对应到项目中,就是用于通信的套接字使非阻塞的,但向套接字传输文件的操作会阻塞

errno为EAGAIN 或 EWOULDBLOCK

解决办法:出现这个错误后,继续尝试传输

// 套接字缓冲区已满,继续尝试传输
if (errno == EAGAIN || errno == EWOULDBLOCK)
{
    continue;
}

为什么会出现这个问题?

可能是因为套接字的接收缓冲区较小,默认为8K,最大可设置为8MB.

调大套接字缓冲区的大小,从而减少缓冲区满的情况,加快传输速度。但是缓冲求并非不是越大越好,套接字维护在内核中,缓冲区越大,占用资源越多,要根据情况设置一个合理的值。

2.无法传输完整视频

查看pagecache大小:

cat /proc/meminfo | grep "Cached"。
Cached:           205500 kB

使用strerror(errno)输出错误,错误为。Interrupted system call

表示  执行系统调用的过程中被信号中断。

// 错误:Interrupted system call
                if (errno == EINTR)
                {
                    continue;
                }

但视频传输仍会出现问题:broken pipe,尚未解决

考虑到sendfile本身也不适合传输大文件,因此,大文件使用传统的传输方式,小文件使用sendfile(),阈值为15MB

1.3.3 部署云服务器

因为之前没有使用过云服务器,项目部署到云服务器上,运行,但是无法访问。查资料,发现云服务器对外开放的端口需要手动配置。配置的过程又出现了问题,花了很长时间。

2 项目介绍

基于Linux的web服务器,可响应get,post请求,响应给客户端图片和视频,实现注册功能。可实现上万并发。已经部署在云服务器上。

项目主要模块有:

        封装互斥锁、信号量

        线程池

        连接任务类

到这里,主要模块已经完成,可以实现get请求。

        定时器模块,关闭不活跃连接

        日志模块,记录运行信息、错误信息

        数据库连接模块,实现注册、登录


 

你可能感兴趣的:(服务器,运维)