Linux运维工程师笔试题第二十三套

  1. 请简单说一下python的垃圾回收机制

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    核心机制:Python 的垃圾回收机制主要由 引用计数、标记-清除 和 分代回收 三部分组成,共同管理内存中无用对象的回收。

    (1) 引用计数(Reference Counting)
    原理:每个对象维护一个引用计数器,记录有多少变量引用该对象。当计数器为 0 时,对象立即被回收。
    优点:实时性:对象一旦无引用,立即释放内存。
    缺点:1.无法处理循环引用(如 a = []; a.append(a),导致引用计数始终为 1,但实际已无用)。
    2.性能开销:每次赋值/释放都需要修改计数器,可能影响性能。

    (2) 标记-清除(Mark and Sweep)
    目的:解决引用计数无法处理循环引用的问题。
    流程:
    1.标记阶段:从根对象(如全局变量、线程栈)出发,遍历所有可达对象并标记为“存活”。
    2.清除阶段:回收未被标记的对象(不可达对象)。
    触发时机:定期自动触发(默认每分配 700 个对象或 10 次小对象分配后触发)。
    配置:可通过 print(gc.get_threshold()) 调整回收频率。默认是 (700, 10, 10) 。

    (3) 分代回收(Generational Collection)
    原理:将对象按存活时间分为 3 代(Generation 0~2),存活时间越长,回收频率越低。
    优势:大多数对象生命周期短,分代回收可减少不必要的检查。
    触发规则:当某一代的对象数量超过阈值时,触发该代的垃圾回收。
    强制执行全量 GC:gc.collect()
  2. 列表和元祖和字典和集合的区别


  3. pod起不来的原因一般都有啥?
    首先kubectl get pods -n <namespace>,查看错误提示是啥:
    Pending:未调度或资源不足。
    CrashLoopBackOff:容器启动后立即崩溃。
    Error:容器启动失败。
    ImagePullBackOff:镜像拉取失败。

然后 kubectl describe pod <pod-name> -n <namespace>查看pod详情。

然后 kubectl logs <pod-name> -n <namespace>查看容器日志,如果容器已崩溃,再加上--previous

  1. 如何快速定位Pod处于Pending状态的原因?
    当Pod处于 Pending 状态时,通常表示Kubernetes调度器(Scheduler)无法为Pod分配节点。kubectl describe pod -n 看一下pod详细信息,重点关注 Events 部分,通常会直接提示错误原因,例如:
    a.资源不足(Insufficient CPU/Memory)
    b.节点选择器(NodeSelector)不匹配,此时需要查看标签kubectl get nodes --show-labels
    c.污点(Taint)与容忍度(Toleration)冲突,此时需要kubectl describe node <node-name> | grep Taints 查看污点
    d.持久卷(PersistentVolume)无法绑定
  1. gitlab冲突处理?
    首先git checkout dev你从当前分支切换到指定的分支dev。

git pull origin dev 拉取最新代码(Pull),确保你本地的代码是最新的。
git status 查看哪些文件发生了冲突,比如出现了both modified: app.py,这说明app.py文件存在冲突,然后处理具体的冲突。

然后git add app.py 将修改后的文件标记为冲突已解决。

下一步是git commit -m "Resolved merge conflict"提交合并(Commit)。

最后git push origin dev将代码推送到远程仓库。

  1. python如何在一个函数内部修改全局变量?
    函数内部global声明 修改全局变量, 比如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    a = 5

    def func():
    global a
    a = 4

    func()

    print(a)
  2. python里,map()函数有用过么?
    map()函数可以将一个函数应用到一个序列上的每一个元素,并返回一个新的迭代器。举个例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 定义一个函数,计算一个数的平方
    def square(x):
    return x * x

    # 初始列表
    numbers = [1, 2, 3, 4, 5]

    # 使用 map() 函数将 square 函数应用到 numbers 列表的每个元素上
    squared_numbers = list(map(square, numbers))

    # 打印结果
    print(squared_numbers) # 输出: [1, 4, 9, 16, 25]
  3. 统计字符串每个单词出现的次数”kjalfj;ldsjafl;hdsllfdhg;lahfbl;hl;ahlf;h”

    1
    2
    3
    4
    5
    from collections import Counter

    a = "kjalfj;ldsjafl;hdsllfdhg;lahfbl;hl;ahlf;h"
    res = Counter(a)
    print (res)
  4. list里的append和extend的区别是啥?
    list里的+方法等价于extend

  5. CPU 使用率里的%usr %system %iowait 这些都是啥?

    1
    2
    3
    4
    用户 CPU 使用率(%usr):包括用户态 CPU 使用率(user)和低优先级用户态 CPU 使用率(nice),表示 CPU 在用户态运行的时间百分比。用户 CPU 使用率高,说明用户态进程占用了较多的 CPU,应该着重排查进程的性能问题。
    系统 CPU 使用率(%system):表示 CPU 在内核态运行的时间百分比(不包括中断)。系统 CPU 使用率高,说明内核比较繁忙,应该着重排查内核线程或者系统调用的性能问题。往往它高了会带动%usr也变高。查看指标:mpstat -P ALL 1
    等待 I/O 的 CPU 使用率(%iowait):通常也称为 iowait,表示等待 I/O 的时间百分比。iowait 高,通常说明系统与硬件设备的 I/O 交互时间比较长,应该着重排查系统存储是不是出现了 I/O 问题。
    软中断和硬中断的 CPU 使用率(%softirq %irq ):分别表示内核调用软中断处理程序、硬中断处理程序的时间百分比。它们的使用率高,通常说明系统发生了大量的中断,应该着重排查内核中的中断服务程序。
  6. 系统的 CPU 使用率很高,却找不到高 CPU 的应用?
    有可能是短时应用导致的问题:
    a.应用里直接调用了其他二进制程序,这些程序通常运行时间比较短,通过 top 等工具也不容易发现。
    b.应用本身在不停地崩溃重启,而启动过程的资源初始化,很可能会占用相当多的 CPU。

  7. 应用的Metaspace 使用率高,都有什么样的原因?
    a. 加载的类数量多,类加载也会导致 CPU升高(少数静态类加载除外)
    b. 新类与老类共存(未卸载旧类)
    c. Metaspace 泄漏(Memory Leak)
    d. JVM 参数配置不当

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------