一面:
1.问:
-2 -1 1 3 4 5 6,找出缺失的正整数,比如这个样例就是2,然后1 2 3 4 5缺失了6,我排了序然后就遍历一遍就找到了,然后问了时间复杂度空间复杂度。答的nlogn,然后面试官问有没有更优的,我说估计有On的吧,然后就继续了
2.问项目:
问:看你简历上写了用redis+lua来保证某个时间段内限制用户访问的次数,这个是怎么实现的
答:这个我答的是redis以List为value,这个List最长长度就是限制用户访问的次数。
追问:lua里面涉及了redis的什么命令
答: <这个搜redis滑动窗口限流可以看到代码,这里就不展开了>
追问:为什么问lua?如果先get出来,在修改list再设置进去,会怎么样?
答:为了保证原子性,如果先get出来再set进去会导致有多个请求同时过来的时候,最后一个修改的请求会让其他请求的修改丢失
3.
问http常用状态码,以及见到这些错误之后的排查思路:
答:
50x直接去看服务器日志
400请求参数错误,去看请求然后分析有没有问题哦
401权限错误 我只答了个一般是业务上直接返回的
403那时候没答出来,只记得是一个和权限有关的
404就是not found
4.mysql的引擎有哪些,索引有哪几种,索引实现的数据结构,使用索引要注意哪些点?
这个不展开了,老八股文了
5.下面哪些字段不适合做索引,学生表的学号、姓名、性别?
答:性别,在性别上等值查询可能相当于全表扫描还可能要回表,失去了索引的意义
6.如果有a b两个字段,按b来排序,那应该怎么建索引?理由是什么?
b a,避免排序和回表
7.项目里用到的分布式锁
答:当时redis是主从架构的,没用redlock,用的是setnx的原子性
8.你有什么问题要问?
我表现的怎么样?面试官回答不错。
一面非常顺利,当时还挺高兴的,让我万万没想到的是,二面才是噩梦的开始
二面:
1. 你平时用java对吧,你是22届毕业对吧?
答:是
2.假设操作系统内存是4GB,其中有2.5GB被A进程占用了,操作系统本身占用0.5GB内存,这时候如果fork了这个进程,是否能成功,为什么?
答:可以,答了copy on write
3.一开始问有没有见过进程的Z状态,没答出来就问了,进程有哪些状态:
答 新建 阻塞 运行 就绪 终结
追问:终结状态和在操作系统里彻底被回收的区别是什么?
这个瞎扯了点,盲猜了一个安全点
4.有了解过java的gc机制吗?
答 有
追问 用java写项目的时候,有没有对jvm的参数进行一些调整?
-----绝望从这个地方开始-----
答 有,然后围绕着CMS+Parnew 的减少老年代GC展开了一系列的回答,
追问,那你们当时线上的配置是多少,多少G内存,然后你当时多少并发量,你通过把jvm的什么参数调整到多少,然后实现了老年代gc频率从多少到多少的转变?
这个直接就没防出去,然后他降低了难度,问我怎么预估参数,我说用操作的数据结构的大小乘个参数
追问这个参数是根据什么算的?jvm半年没复习了,当时学的忘了。
5.Linux cpu占用率 内存占用率,还有剩余内存 网络带宽怎么看,压测怎么对他们进行调整?
Cpu和内存占用率和剩余内存我答的用top,网络带宽占用了多少。
6.redis线上部署单机配置,几核几G的配置,能抗多少并发,网卡多少带宽,tps qps多少,这个疯狂追问,这波很尴尬,连续两个线上配置的问题都没答出来,因为以为实习不考这个,所以之前一直懒得亲自去拿各种配置去压。
7.问项目:
我写了redis因为主从复制延迟而拒绝的客户端的请求,然后我在客户端那做了一个降级,先把命令写在磁盘里,这个也是一波疯狂追问
有点忘了追问的什么,但是这个答的一般,而且还有个地方想了挺久才回答出来,这部分持续追问了18分钟,追问内容包括了,写的命令会不会丢失:这个我模仿rocketmq的放丢失消息机制说会,因为没有两阶段提交,而且就算写到磁盘里也可能因为在pageCache中而丢失
8.前面那些问题加起来问了40分钟了
9.看你简历写你了解Kubernetes,来问你一些问题?
问:通过service去访问5个对等的pod,上游怎么知道pod在哪呢?
答:service在etcd里面拿到pod对应的5台机器的ip然后做负载均衡
追问:当时用的时候,pod的网络用的是什么网络?一个pod请求到另外一个pod是一个什么样的过程
答:flannel,答的是UDP的那套方案,在1.20之前(docker没被k8s抛弃之前),docker创建docker网桥,然后容器和宿主机之间通过veth pair虚拟设备来达到两个namespace之间进行通信,忘了答的啥,反正就是VTEP 设备监听,然后内核态数据流向flanneld进程包装成udp,然后拿到etcd的元信息,然后再宿主机上转发出去。这个其实答的不好,因为udp是已经被完全放弃的一个状态了。
10.项目中的难点
11.你有什么要问的,已经1个小时了
12.然后出了道算法题,给一个字符串,然后用5个*分割成6份,分割出来的每一部分的大小不超过600,打印出所有分割情况,然后他当时就给我一小时让我做,不能用暴力,那时候被前面的压测连环问搞破防了,然后就没心情了其实。
1. 自我介绍:
2(简历写了).了解ElasticSearch么?说一下ElasticSearch从写入数据到别的进程可以看到这个数据的整个流程?
答:先写到一个buffer里面,同时把数据写到一个日志里面,然后每隔一秒,那个buffer里的数据会刷到segment file里,写入文件的时候先写pageCache,写到pageCache之后就可以搜到了
追问:ElasticSearch是实时的么
答:不是,因为要先写到内存的一个buffer里然后过一段时间再写到磁盘里
3.(简历写了)说一下Zookeeper的集群模式,以及具体流程
答:ZAB协议,然后对ZAB协议进行解释
4.解释paxos、raft协议
5.redis集群模式(简历有写)有哪些,redis持久化的方案
答了哨兵和redis cluster,然后持久化就AOF 和 RDB,然后AOF和RDB什么时候会被用来恢复。
7.问完前面就只过了15分钟
8.然后就出了道题让我做,给一个字符串数组,打印出频率在前K的字符串,要求时间复杂度NlogK,我用了个堆+哈希,后面发现不行,然后就只用了堆,但是只用堆的时间复杂度为NlogN,他说要预处理一下,其实我写的时候面试官就去干别的了,然后我写完10分钟他才回来,然后这个其实我算没满足时间复杂度的要求?
腾讯这个感觉凉定了,算法题之前加起来只问了15分钟,虽然我都答出来了,然后再加上我做算法的时候面试官的反应,而且他在问完我第3个问题的时候,自说自话说了一句,怎么你用的这些技术我都没用过?其实这个我在当初选java这条路的时候就考虑过和腾讯不太兼容了,不过当时看到牛客网上java面经那么多就以为java很香,实际上在广东这边有点一言难尽(简历上除了他上面问的,我还写了RocketMQ,SpringBoot,SSM,K8S,docker,nginx,Netty,Dubbo),而且用的也全都是了解的字眼,其实我是希望他来问的,SpringBoot、Netty、Dubbo、Zookeeper我都大概看过源码。。。我还想着写个了解把他们留着拿来当底牌主动输出,但是非java体系的根本不吃这套,不吃这套我还以为他们会考os和计网那块的八股文,也没料到这些也没考,考前我专门背了好久的八股文和java基础,这两场都完全不考。其实本来不想大三寒假就去实习的,感觉还差了挺大的火候,但是看着牛客网上很多大三去实习的面经,我就也想去试试,没想到。。。被虐的体无完肤,之前只去了解一下压测大概的理论,不亲手去测。。。现在自食恶果,然后本来把想去阿里、美团、京东、小米那些试试的,但是阿里美团这个时间点根本不要人,京东小米这些又在北京。现在开始慢慢理解,为什么我们学校的学长基本都是C++和go派系的了,不夸张地说,18级(22届毕业)的只有我一个人在搞java的,其他后台要么php要么C++,要么就是go。寒假实习估计就没什么戏了,还是等暑期实习看看把,看看能不能到上海、杭州那边要java而且又招人比较多的地方,然后顺便开始转go了,实践一下K8S,看看K8S的源码,最终还是想留广东的,不过阿里在杭州,hc又少(听说不怎么招应届生,当然要是阿里愿意要我的话,我还是愿意去杭州的),拼多多在上海。然后就是之前写的那个项目,他们要部署了,有两台内存256G内存的服务器,好像是浪潮的,都是24v,帮他们部署的时候,顺便把redis、rocketmq、elasticsearch、mysql的压测,还有以前项目的全链路压测给做一下,防止再次被项目暴打吧,争取暑期能拿个大厂实习,然后秋招能收获个offer吧,最好是广东这边的。越想越觉得自己可悲,从12月4号开始投简历,投了10几份就只有2个面试机会,还被我浪费掉了,看着周围那些同级的大佬靠着C++、客户端、前端拿了腾讯、头条的日常实习,真的好羡慕啊。
全部评论
(29) 回帖