飞道的博客

这些Linux技能你会了,面试官:哎呦小伙子不错哦!

407人阅读  评论(0)

这里简单的必知必会的Linux命令在这里我就不说了,网上百度能找到一大推的教程,今天我主要分享一下关于Linux使用方面的经验和面试技巧。

道理如是,能动手尽量别“吵吵”!

面试是一个考验面试者的过程,是你在日常学习中使用过的技能和知识点的一个总结性考试,你和别人拉开差距的原因我们抛开运气和个人表达的因素,影响面试结果很大的原因是因为别人对于知识点的掌握更有层次,更具体,更熟练。作为一个开发者,一直以来我认为一个开发人员最重要的就是动手能力,不能纸上谈兵,你知道这个知识点和技能,但是缺乏实战,在面试的过程中就很有可能暴露出很多的漏洞被面试官逼问,然后原形毕露,所以,知而行之,我认为是提高技能和灵活应变的最重要的一个方式。

首先通过一个简单的面试给大家分享几个面试中的小技巧吧,这是小码来应聘东家携程的面经呦:

面试官:小码你好,做一下自我介绍吧。

小码:面试官,您好,我是来自XXX大学的本科应届毕业生,我的专业是网络工程,说起我的专业,我对它充满了浓浓的喜爱....balabalaba...具体的记不清了,我所有的面试基本都是使用的一套开场白,在这段开场白里,我给面试官透露了我对计算机行业的喜爱,我是怎么喜欢钻研(读源码呀、关注技术论坛、写博客、做项目、对于感兴趣的知识喜欢写小程序去测验等等),开场白要跟简历上你所擅长的技能挂钩,也是引起面试官的注意。自我介绍不可早早而过。是一个套路面试官的过程。

在我的开场自我介绍中,我其实是在暗示面试官:快看我博客,快问问我写过哪些有趣的小测验。

很遗憾,面试官没有问,但是这并不影响我去展示这方面,在面试的过程中要找到自我的节奏,想方设法的去吧自己擅长的东西展现在面试官的眼前。

面试官:用过select吗,他的原理是什么呢?

小码把select、poll、epoll精髓,把select和epoll的底层实现给面试官讲了一遍,其实到这里我的回答已经足够了,但是做为一个对知识融会贯通的面试者,我需要把我热爱钻研,概念落于实践的一 面展示出来,我回答完上面的问题之后,我们面试官说我还用epoll测试过单机最大支持的链接数是多少。

面试官:来来来,说一下你是怎么测试的。

你也能看出来,面试官的兴趣被你钩了起来,这就是你自己找到的机会。我是怎么回答的呢?

小码:测试单机支持的最大TCP链接数 这是我实实在在测试的过程,你感兴趣可以试一下,这个测试你可以给面试官展现这样几点:1、epoll你真的会用,不是停留在概念上。2、你喜欢钻研和实践、动手能力强。3、你通过网络相关的技能展示了linux网络调优方面的技能,一举三得。

面试官:你还做过其他有趣的测试吗?

小码:线程内存分配测试     共享内存作为缓存小测试

这几个小测试你都可以动手测试一下,面试的时候给面试官讲解一下你测试的初衷、过程、结论,你的面试会很加分。

总结一下上面的面试,两个小技巧吧:

  • 自我介绍就像写作文的索引,给下文做铺垫
  • 面试中把握主动权,遇到相关的技能,举一反三,可以把自己平常的小测试,小兴趣表现出来。

好了下面进入正题,我们分享的是Linux相关内容

Linux操作系统面试常见问题

什么是大端和小端?如何判断一个系统是大端还是小端?

  • 大端就是高位字节存放在内存的低地址段,低位字节存放在内存的高地址段;
  • 小端就是低位字节存放在内存的低地址段,高位字节存放在内存的高地址段;

判断方式C++:


  
  1. union {
  2. short val;
  3. char c[ sizeof( short)];
  4. } test;
  5. test.val = 0x0102;
  6. if (test.c[ 0] == 0x01 && test.c[ 1] == 0x02)
  7. cout << "big endian" << endl;
  8. else
  9. cout << "little endian" << endl;

判断方式Java:


  
  1. static {
  2. long a = unsafe.allocateMemory( 8);
  3. try {
  4. unsafe.putLong(a, 0x0102030405060708L);
  5. byte b = unsafe.getByte(a);
  6. switch (b) {
  7. case 0x01: byteOrder = ByteOrder.BIG_ENDIAN; break;
  8. case 0x08: byteOrder = ByteOrder.LITTLE_ENDIAN; break;
  9. default:
  10. assert false;
  11. byteOrder = null;
  12. }
  13. } finally {
  14. unsafe.freeMemory(a);
  15. }
  16. }

处理器的状态可以分为哪几种?

  • 内核态,运行于进程上下文,内核代表进程运行于内核空间;
  • 内核态,运行于中断上下文,内核代表硬件运行于内核空间;
  • 用户态,运行于用户空间。

并行和并发有什么区别?

  • 并行是指在同一时刻,有多条指令在多个处理器上同时执行,无论从微观还是宏观上来看,都是多个独立任务同时执行,适用于资源充足的情况,如多核;
  • 并发是指在同一时刻只能有一条指令执行,但多个指令被快速地轮换执行,使得从微观来看不是多个独立任务同时执行,但从宏观来看是同时执行,适用于资源有限的情况,如单核。

程序编译的顺序是什么?

  1. 预处理:源代码经过预处理器,生成一个.i中间文件,这个阶段会把#include的头文件内容进行替换,并处理宏定义;
  2. 编译:.i中间文件生成.s汇编文件;
  3. 汇编:.s汇编文件经过汇编器生成.obj目标文件;
  4. 链接:.obj目标文件经过链接器,与lib静态链接库和dll动态链接库生成可执行文件。

库函数与系统调用有什么区别?

  • 库函数属于语言或应用程序的一部分,而系统调用是内核提供给应用程序的接口,属于系统的一部分;
  • 库函数在用户地址空间执行,运行时间属于用户时间,开销较小;而系统调用是在内核地址空间执行,运行时间属于系统时间,开销较大;
  • 库函数采用缓冲区技术,可以在读写文件时减少系统调用次数,从而提高效率。

实际问题和Linux命令排查

内存占用过高

  1. 查看内存占用情况

-- free查看内存占用情况

参数:

  • total:总计物理内存的大小。
  • used:已使用多大。
  • free:可用有多少。
  • Shared:多个进程共享的内存总额。
  • Buffers/cached:磁盘缓存的大小。
  • #所以空闲内存=free+buffers+cached=total-used

-- cat /proc/meminfo

-- 查看进程的内存占用

pidstat -r -p 12345 1 5  这个命令结合top或者slabtop使用

top命令:

找到内存占用多的进程pid,使用pidstat查看进程的内存占用情况。

ps aux | head -1;ps aux |grep -v PID |sort -rn -k +4 | head -20

该命令查看内存占用最高的前20个进程。我们找到导致内存占用高的进程后,可以使用

kill命令将进程杀死。

cached占用过高问题

cached主要负责缓存文件使用, 日志文件过大造成cached区内存增大把内存占用完 。

Free中的buffer和cache:(它们都是占用内存):

  • buffer : 作为buffer cache的内存,是块设备(磁盘)的缓冲区,包括读、写磁盘
  • cache: 作为page cache的内存, 文件系统的cache,包括读、写文件

如果 cache 的值很大,说明cache住的文件数很多。

如何解决呢?

#常用方法是执行下面的命令

  1. sync
  2. echo 1 > /proc/sys/vm/drop_caches
  3. #清除后要还原系统默认配置:echo 0 > /proc/sys/vm/drop_caches
  4. #查看设置 sysctl -a | grep drop_caches

补充: echo 字符串 > 文件  就是把字符串内容从定向到文件中

然后可以重复上面查看内存的方式查看内存的使用情况。

cpu飙升,机器停止运作

我们不考虑进行重启

CPU飙升排查思路

1、使用vmstat查看CPU负载情况


   
  1. // 每间隔2秒钟打印一次系统维度的CPU复杂情况
  2. vmstat -n 2

 

参数

  • r: 表示系统中 CPU 等待处理的线程。由于 CPU 每次只能处理一个线程,所以,该数值越大,通常表示系统运行越慢。
  • us:用户模式消耗的 CPU 时间百分比。该值较高时,说明用户进程消耗的 CPU 时间比较多,比如,如果该值长期超过 50%,则需要对程序算法或代码等进行优化。
  • sy:内核模式消耗的 CPU 时间百分比。
  • wa:IO 等待消耗的 CPU 时间百分比。该值较高时,说明 IO 等待比较严重,这可能磁盘大量作随机访问造成的,也可能是磁盘性能出现了瓶颈。
  • id:处于空闲状态的 CPU 时间百分比。如果该值持续为 0,同时 sy 是 us 的两倍,则通常说明系统则面临着 CPU 资源的短缺。
2、top -p按照cpu的占用情况排序显示,找到占用cpu高的进程,终止或者杀死进程,分析是代码问题还是硬件问题导致,从本质上解决问题之后,再重启进程。
 
3、如何查看进程下哪个线程占用cpu较高?
程序中导致cpu占用过高,往往是存在循环或者线程的任务过重等情况,通过上述方法确认了是java进程导致CPU飙升后,我们可以在终端通过 jps或者java进程的PID,然后在使用 top -H -p java进程pid 查看占用CPU较高的java线程。
 
 

jstack打印进程下全部的线程堆栈信息,查找CPU占用较高的线程的堆栈详情信息?

通过jps找到占用cpu最高的线程是24341

将24341这个十进制的pid转化为16进制的,方式如下


   
  1. [root@VM_0_11_centos ~]# printf "%x\n" 24341
  2. 5f15

然后使用jstack打印java进程的堆栈信息,查看0x5f15对应的具体堆栈信息


   
  1. [root@VM_0_11_centos ~]# jstack 24040 | grep 5f15
  2. "ContainerBackgroundProcessor[StandardEngine[Catalina]]" # 35 daemon prio= 5 os_prio= 0 tid= 0x00007fd53022b800 nid= 0x5f15 waiting on condition [ 0x00007fd4fb0fd000]

可以看到这样显示的不全,那一般的话会先打印全部堆栈信息到文件中,在文件中查看

[root@VM_0_11_centos ~]# jstack 24040 > jstack.log

这样可以定位到具体是因为哪一行代码导致的cpu飙升,从而优化代码来达到目的。

netstat命令帮你真正的了解网络的状态变化

你总是在说TCP的三次握手、四次挥手,但是你真的理解吗,通过netstat命令结合链接实例你可以实时观察网络状态的转变,排查网络问题,这里提供一个我认为比较有学习价值的博客,我就不再次总结了,如果你需要测试程序,或者不知道如何测试,可以私信我、加我主页的交流群,进群交流。

实战--使用netstat监控网络连接信息

掌握了上面的命令,面试的时候结合我提到的两个技巧,我想你会让面试官眼前一亮的,加油!!祝你拿到心仪的offer!!


转载:https://blog.csdn.net/lyztyycode/article/details/106148882
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场