web server日志、定时器等相关面试题

  • 为什么使用定时器?

    • 该项目中的定时器是为了关闭在客户端和服务器之间建立的、长时间没有请求的连接,由于每个连接都需要消耗一些服务器的资源,如端口号,关闭连接可以帮助释放资源,让服务器更好的处理新请求,提高服务器的响应速度、资源利用率
  • 定时器模块的工作的原理?

    • 项目使用一个带头尾节点的双链表保存定时器,并按照超时时间升序排列,定时器结构体存储了定时器的到期时间

    • 服务器启动时,创建监听套接字,绑定到指定端口,并开始监听;接收新的客户端连接,将其加入到epoll实例中,并为每个新连接创建一个定时器、设置到期时间

    • 使用alarm设置定时器,每隔一段时间发送SIGALRM信号,并通过管道通知主循环处理

    • 主循环使用epoll_wait等待I/O事件或定时器事件,当SIGALRM信号触发时,主循环调用timer_handler关闭非活跃的客户端连接(将定时器从链表中移除)

  • 讲一下你的日志模块的运行流程

    • 为方便管理,日志是用单例模式实现的,首先调用方法获取日志的单例实例,并对日志初始化(指定日志级别、最大队列大小、同步or异步等)

    • 需要记录日志时,日志类中的写方法会先检查日志行数有没有达到最大值,随后将日志信息添加到队列中,再由后台线程取出日志信息写入文件(后台线程处理,保证了不会阻塞主线程的运行)

  • 为什么使用了异步日志,讲一讲这个异步日志是怎么实现的

    • 同步日志指的是写入日志与工作线程串行,异步日志将日志写入函数交给其他线程,更加高效

    • 本项目的日志使用了生产者-消费者模型,将日志内容先存入阻塞队列,写线程再从队列中取出内容,将日志写入磁盘中

  • 你的服务器支持多少的并发量,你是如何做压力测试的?

    • 水平触发,1W的并发量,ET模式应当会更高
  • 你这个webbench是什么,介绍一下原理?

    • 是Linux上一款知名的web压力测试工具,展示每秒钟响应请求数和传输数据量

    • 首先fork出多个子进程,每个子进程循环做web访问测试,子进程把访问结果通过管道告诉父进程,父进程统计最终结果

  • cpu忽然百分之百了该如何排查?

    • Windows下查看任务管理器,Linux下使用ps命令查看CPU使用率最高的进程,然后分析进程信息,系统进程考虑是否由于系统更新导致

    • 查看日志文件,看是否有错误或警报信息,Linux下/var/log/syslog文件

    • 用netstat检查网络连接情况,网络连接异常也可能导致CPU使用率过高

  • 你的项目里用了哪些设计模式?怎么实现的?

    • 在线程池和定时器使用了单例模式,确保一个类只有一个实例

    • 先私有化其构造函数(该类不能被外界实例化,构造方法只能为private),自行实例化(实例是当前类的静态成员变量),并用一个公有的静态方法获取该实例

    • 分为饿汉式(在类加载的时候就立刻实例化)和懒汉式(在第一次使用的时候再进行实例化)

  • 单例模式优缺点?

    • 优点:由于只创建一个实例,可以减少内存消耗;保证了唯一性(很多情况下保证一个类只有一个实例很重要,如打印机);提供了唯一的访问点,可以在应用程序的任何地方访问到相同的实例

    • 缺点:访问点唯一,代码耦合性增加,单元测试困难;实例数量受限,代码重构困难

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值