跳转至

笔记

1.3 making-money business

人的精力是有限的,投入到自己喜欢或者为生的事情上,其他的事情,专业的事情交给专业的人

1.2 Career

职业规划:

职业规划是成为 AI系统的性能分析建模分析 -> 理解AI算法数学本质, 设计爆款AI算法应用:

  1. 测量各组件指标,
  2. HPCG,HPC, AI benchmark
  3. 分析理解应用瓶颈

计算机职业规划

  1. 自底向上分析理解和设计计算系统(系统建模与高层次的抽象) + 企业核心落地应用
  2. 融入公司的核心竞争力的发展。参与到低延迟,高并发的高性能系统的设计。(使用、理解、设计)
  3. 传统应用的优化入手,分析计算系统的上限和程序的性能释放瓶颈,从而了解系统瓶颈。并考虑上异构的系统或者FPGA来解决。

以性能优化为切入点,系统建模和分析数据流程之后,解析程序瓶颈(深入了解对应操作系统是如何调度实现的,来深入了解内核),探寻性能最佳的执行手段。

具体职位的转变

  1. 百度/华为AI系统(软件性能工程师) -> 应用在GPU上的适配的瓶颈 -> AI系统架构师 -> AGI系统架构师
  2. 阿里云 HPC组(深度学习虚拟化技术) -> mihoyo 的 云游戏部门
  3. 需要调研云游戏现状
  4. 互联网 -> 30岁考公回长沙

公司分析

候选公司

  1. 一线互联网BAT: 百度, 阿里, 腾讯, 字节
  2. 华为
  3. 美团,快手
  4. 新兴明星公司:mihoyo,小红书

甄别技巧

  • 真想招聘人的公司,是能感受到那种诚意的,是站在用人的角度去考虑问题,基本问一些相关的情况。差不多能用就发offer了。3
  • 有些公司明显就不想招人,不仅问的是否详细,内容也十分偏。折腾半天,最后也不了了之了。
  • 除此之外有些公司只是为了解决自己的问题,面试是能感知到一些东西的,遇到明显套方案的公司,不要什么都说,要有所保留。

就业指导

  1. 选行业:关注国家政策,关注社会趋势
  2. 选平台:第一梯队,如果可能只要首位
  3. 选团队:选主不选辅,技术厚度,慎选小Team
  4. 选上级:经验,口碑,性格特点,梯队历史
  5. 看待遇:长期发展,短期收益,PK offer
指标一:大厂与国家的科研布局

华为遥遥领先,基础研发有待加强4

指标二:计算机相关的国内500强

普联是制造业的500强(1),和讯飞暂时还无法进入民营500强1

  1. 2023年制造业500强也找不到了

案例实践:2023秋招 华为 vs 百度

  • 华为 - 昇腾产品线 - 昇腾计算开发使能部 - 软件开发工程师
  • 百度 - TPG基础计算体系 - DLTP深度学习技术平台部 - 飞桨引擎异构部门 - 异构计算工程师
比较项 华为 百度 百度相较于华为
公司影响力 爱国色彩,消费者认知 对于消费者还停留在搜索引擎 -1
变现渠道 结合终端产品和自身的服务器产品,AI能很好落地 卷AI模型软件网络服务,落地到AI百度搜索/智能云2,硬件基础和销售弱一些 -1.5
发展机遇 新部门开拓期,杭州和青浦定位相同,可选范围广 百度的核心AI业务的核心引擎部门 0
定级/晋升难易 特批的16级 T4 +0.5
部门团队 200人大部门 20人,较小独立的精致团队,便于团队内交流, 和领导也聊得来 +1
师兄帮助 有同届的spq,还有lh师兄等师兄 唯一zpq师兄,还是在独立的昆仑芯 -1
工作学习内容 华为摸索期,会有基础琐碎业务,参与到下一代昇腾, MindSpore(2020年3月)的研究 百度走在国内前沿, 学习了解飞桨平台(2016年8月底) -1
毁约影响 没谈成之后也可以跳过来 毁约后很难再来 +2
跳槽难度 不是传统互联网节奏 更适合在互联网企业流转 +0.5
工作强度/节奏 8点半9点走,月末周六加班 七八点走 +1
买房压力 青浦房价低,但是不适合定居 浦东房价高 -1
生活通勤成本 便宜单人宿舍,应该离工作地点近, 食堂应该不错 住房成本和环境确实高一些 (+住房2k/month) -1.5
周围配套(娱乐生活) 偏远上海青浦,距陆家嘴/高铁站(2h+/1.5h) 上海浦东,距陆家嘴/高铁站(42mins/1.25h) +1
稳定性 两年较稳定期 全靠自己实力 -1
工资 特批之后是同薪资(但基础工资的公积金差7% -3k) 高薪 (n)*16 +1
综合 专心的奋斗者,致敬 + 更长远的布局和共同成长 工作和快乐生活更平衡 + 接触工业界的前沿知识 -0.5
工作内容:华为 昇腾计算开发使能部
  • 调优体系工具Nsight(算子,网络训练分析
  • 训练优化,精度提升(内存优化, 千卡万卡调度,通讯库
  • 推理优化(AI算法强相关
  • 算子体系(1. 编译器 TVM 2. 调试系统开发)
工作内容:百度 异构计算工程师

工作职责:

  • 参与AI推理引擎底层算子库的开发与优化,提升异构资源计算效率
  • 参与大规模AI计算通信库及通信算法的开发与优化,提升大规模AI训练效率
  • 探索面向CPU/GPU/FPGA/ASIC等多元化计算架构的编译系统开发、实现编译优化和算法加速

  • 完成其他相关任务

职位要求:

  • 热爱编程,精通C++/Python
  • 具有独立开发能力,对AI算法和流框架有丰富的应用或开发经验
  • 熟悉GPU/ARM/MIPS/DSP等任意异构计算平台
  • 熟悉计算机体系结构,有汇编级别开发经验
  • 有丰富的AI通信加速经验,量化/融合/拓扑优化
  • 熟悉MPI,对不同网络拓扑结构的通信算法及底层通信函数有深入研究,对RDMA,GPU direct等技术有了解

PS: 校招,社招,不限欢迎投递,部门团队直面,提前批招聘,不影响后续22届校招 欢迎投递,大量HC 校招特别说明: 校招生:基础扎实,有兴趣做AI底层计算加速与优化 即可

工作地距陆家嘴

上海房价:浦东和青浦

青浦房价最高到 3.8万左右。

浦东 7~8万。

BTW,华为东莞松山湖目前5-6万。

华为租房买房

华为选址规划:

  • 华为在国内有深圳坂田、东莞松山湖、上海青浦3个总部级研发中心;
  • 有9大一级研究所,分别是北京、上海、南京、西安、成都、杭州、苏州、武汉、长春(筹备中)。

青浦/西岑镇/淀山湖 规划:

  1. 长三角一体化: 2019年立项。华为全球研发中心,投资100亿,2020年开工2024年建成;
  2. 华为目前已经在那块建了大几千套家庭房和几千套单身公寓;合计约1.5万套房。6
  3. 所有金桥,市区其他办公大概20000多个华为研发,华为明年5月全部搬青浦华为中心
  4. 一共陆续要招5w人,

预览图乡村景色, 建议小红书多看看

  • 华为宿舍 :东莞松山湖和深圳坂田都有提供宿舍,一室一厅的话1600一个月,单间酒店那种的1300一个月。
  • 华为住房:公司有自己盖的房子,有出租的,也有可以买的。出租的叫荔枝苑,无论级别都能住,但是要排队,房租2k到3k左右。买房的话,房价差不多1万-2万左右。

核心要点

真是两难的问题。其实秋招,我都没想到两边都这么重视,开的也比较高。看来工业界对于 AI System, HPC for AI或者说 HPC for LLM 有很大的期待。

前面的比较的点还是太繁琐了。抛开一点点工资和毁约的影响,选几个核心要点吧:

  1. 研究内容(现阶段):华为相较于百度,能参与到下一代昇腾的研究里去。作为体系结构科班,其实更感兴趣。
  2. 用武之地(上限):从体系结构的角度出发,如何为下一代AI的训练推理注入活力。华为昇腾覆盖的范围比百度更大。
  3. 过渡阶段(稳定性):作为个人,我其实是“转行”。百度虽然现阶段是领先的,但是我可能跟不上。华为这边体系结构的工作可以占比大,切入和适应应该更自然。
  4. 工作伙伴:有同届的spq,还有lh师兄等师兄。百度唯一zpq师兄,还是在独立的昆仑芯
  5. 工作节奏:工作压力时长,肯定是华为更大。但是工作的条件,环境。青浦修好后,肯定非常漂亮。

总体看来,选择华为更契合我未来的长远的职业规划。

后续毁约推进
  1. 如何与百度和解:我纠结了很久,百度也是很喜欢的团队和工作内容。但是在华为能参与到下一代昇腾的开发,这也是我学体系结构的梦想之一,(薪资也差不多)。
  2. 华为先签两方?4月再推进毁约?

公司资料了解

工资评级分析

7

华为的公司架构
  • 三主体:产品线一线交付, 预研部门, 2012部门
  • 产品线一线交付,付钱给预研部门, 2012部门来研究内容
  • 前者在完成指标后,自负盈亏,后者一般是固定年终奖。
华为的公司公开的分红消息

根据公开的资料整理,华为历年的持股收益率,2019年以前,每年的分红综合收益率基本都在25%以上。

近几年即便是在美国的打压下,经营状况没那么好,分红略低一些,但也都在20%以上。

  • 2020年,股价7.85元,分红1.86元,收益23.6%
  • 2021年,股价7.85元,分红1.58元,收益20.1%
  • 2022年,股价7.85元,分红1.61元,收益20.5%

总之,相当于投入100元,平均每年都能拿到25元左右的分红。

百度的参考资料
AI整体布局
飞桨布局

岗位与入职

校招与职业规划

电子市场分析?

To do :

  1. 分 C端、G端、B端分析
  2. 结合产业规模,
  3. 行业发展程度,当前状态(是否有瓶颈,还是需求端不足)。

计算机的经济价值在哪里?= 没有计算机会怎么样?

数字化的工作流能享受到摩尔定律的加速

"Once a technology becomes digital-that is,once it can be programmed in the ones and zeros of computer code-it hopes on the back of Moore's law and begins accelerating exponentially."

  • Peter H.Diamandis Steven Kotler, The Future Is Faster Than You Think
  1. 自动化 (类似加减乘除计算器的各种程序,可以暴露api以黑盒的情况下快速给出准确结果或者推荐选项, 这里主要指利用计算机的计算能力
  2. 开发难点:可用(基于特定算法,或者大数据喂给AI)、易用、好用(性能)。
  3. 没有明显先发优势,由于没有生态概念、迁移门槛低,客户只会选择好用、便宜和高性能的。
  4. 核心竞争力:软件如何实现 大规模,高并发,高利用率(算法,实际技巧)
  5. 便利性 (资源整合平台类似美团打车之类的,考验计算系统的数据库和网络,对应的低延迟,高并发)
  6. 开发难点:好用(快响应,低延迟),长期运维的稳定性
  7. 明显的先发优势:用户生态形成壁垒。参与对象越多、越好用、用户依赖程度越高。
  8. 核心竞争力:与人的交互的软件设计思路(飞书企业协作管理,集成了项目进度的allInOne极简模板平台),最全面的资源(美团最多的店家、高德最详细的地图、M站最多的种子数、B站最多泛二次元群体),稳定的运行,比用户需求高的快响应,低延迟性能。
  9. AI全面解放人类(具体指AI代替人做事情,解放人类,e.g., 机器人,自动驾驶,AI编程)
  10. 开发难点:当前AI必须有下面几点才能快速向AGI发展:
    1. 人类思考问题的正确逻辑链
    2. 基于已有的知识(世界模型),有识别输入知识的正确性的能力。
    3. 这样基于正确的知识的正确的推导,才能形成正确的结果。乃至真理(毁灭人类是必须的)。并在计算机的高速无休止运行下快速成长。
    4. 也就是说AGI要有明显的人格特质,不是指说话的语气,而是AGI的每个观点要是经过思考达到和谐平衡的结果。当然不排除思考过程中死循环的事情,比如先有鸡还是先有蛋。
  11. 当前AI,只能接受数据集的知识,没有自我思考并选择的过程
  12. 核心竞争力:支持AGI的计算系统是什么样子的呢?
    1. 抽象来思考:计算、访存、网络是三部分基石。类似人形机器人的设计。计算单元来实现大量内存记忆数据的读取 和 网络实时交互学习信息的 过滤思考
    2. 性能指标:低延迟,高吞吐。
    3. 计算单元:针对思考过程的特殊操作设计,数学推导关系的实现?集合论?是非关系?这种场景下还需要GPU的这么多核并发吗?
    4. 内存要考虑的是存算一体的可能性?不然就是吞吐和延迟

Costume 端 特有的:

  1. 内容生产(AIGC)
  2. 开发难点:达到人类审美的AI内容
  3. 没有明显的先发优势, 生成内容的风格会筛选用户。
  4. 核心竞争力:支持的生成方面广(生成内容的风格需要能定制化),内容质量高,速度快。
  5. 文娱产业(电子游戏,视频内容)
  6. 开发难点:丰富的游戏细节,和与时俱进的美术。
  7. 没有明显的先发优势, 游戏内容的精度和新鲜感是最重要的。
  8. 核心竞争力:如何实现工业化的高级美术和剧情产出(AIGC?)。

计算机行业为什么赚钱? 这个理由能持续下去吗?

  1. 门槛低,一台笔记本就可以写软件,从便利的各种小工具,到大型软件。
  2. 在专利保护下软件复制成本近乎零,收益稳定。可以实现薄利多销。
  3. 低成本复用性:一个APP开发好之后,可以在不同位置和时间无成本复制(指每个人可以在任意时刻使用软件服务)。 第一产业生产的粮食和工业制品都是生产一个消耗一个。服务业也是一次性的。
  4. 无损耗,实现后可以长期生效。是少数跨越时间长河的永恒的东西。
  5. 但是在激烈的竞争下,软件都趋向免费化。靠基于庞大用户群体的平台抽成和附加高级服务(云盘会员,游戏附加充值)来实现。或者是靠免费化吸引一波用户。
  6. 芯片硬件流片周期长,成本高

参考文献

GDB

GDB 基本命令

  • -next单步执行
  • -step单步进入
  • finish 跳出当前函数
  • 跳出当前函数 finish: Continue running until just after function in the selected stack frame returns. Print the returned value (if any). This command can be abbreviated as fin.
  • -continue继续执行到下一个断点
  • -until继续运行到指定位置

运行带参数程序

  • gdb --args 正常程序+参数
  • 进入gdb后运行 set args 参数

break断点

  • f 打印当前文件 ,便于打断点
  • info breakpoints 查看已经的断点
  • del 3 删除NUM=3的第三个断点
给某个结构体内的函数全部上break
rbreak file.cpp:.*TemplateClass.*

GDB 打印信息

  • 参数 show args
  • 局部变量 info locals
  • 修改变量 p result=20
  • 函数调用栈 bt

打印结构体class

gef➤  p -raw-values off -- this->TotalCycles
gef➤  p this                                                                                                                                                                                                                         
$11 = (llvm::mca::SummaryView * const) 0x7fffffffcc08                                                                                                                                                                                
gef➤  p *this

打印指针变量

  • 二维指针 p **matrix@3@3
  • 一维指针 p *matrix@3
  • 或者转换为数组 p *(int *)matrix@3
  • 或者转换为数组 p *(int (*)[3])matrix

打印数组

(gdb) p array[60]@10
$9 = {60, 61, 62, 63, 64, 65, 66, 67, 68, 69}

可以看到打印了array数组第60~69个元素的值。如果要打印从数组开头连续元素的值,也可使用这个命令:“p *array@num”:

(gdb) p *array@10
$2 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

GDB中查看指定内存地址内容的指令

examine命令(简写是x)

格式:x /nfu <addr> 说明:

  • x是examine的缩写
  • n表示要显示的内存单元的个数
  • f表示显示方式,可取如下值
  • x按十六进制格式显示变量。
  • d按十进制格式显示变量。
  • u按十进制格式显示无符号整型。
  • o按八进制格式显示变量。
  • t按二进制格式显示变量。
  • a按十六进制格式显示变量。
  • i指令地址格式
  • c按字符格式显示变量。
  • f按浮点数格式显示变量。
  • u表示一个地址单元的长度
  • b表示单字节,
  • h表示双字节,
  • w表示四字节,
  • g表示八字节

example:

(gdb) x 0x8049948
0x8049948: 0x20726f46
(gdb) x/s 0x8049948
0x8049948: "For NASA,space is still a high priority."
(gdb) x/4 0x7fffe536dbc0 # display 4 bytes info?
0x7fffe536dbc0: 0x0     0x0     0x9d835 0x0

打印寄存器值(表格)

layout split
layout regs
tui reg general

gef 界面

效果

真好用,什么都会打印

安装gef

bash -c "$(curl -fsSL http://gef.blah.cat/sh)"

# 没有网,手动下 https://gef.blah.cat/py ,替换
$ wget -O ~/.gdbinit-gef.py -q https://gef.blah.cat/py
$ echo source ~/.gdbinit-gef.py >> ~/.gdbinit

注意:gdbtui 与 gef 不太兼容

需要进一步的研究学习

之前gdbtui的使用写在notion上了

https://shaojiemike.notion.site/GDB-d53a1be0b6324234a2ae43b7c27a23b8## 遇到的问题 暂无

开题缘由、总结、反思、吐槽~~

参考文献

Linux Network Command Guide

lsof

  • lsof(list open files)是一个列出当前系统打开文件的命令。
  • 由于在linux环境下,任何事物都以文件的形式存在
  • 所以通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件

输出格式

$lsof -i
COMMAND       PID        USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
node        82138 shaojiemike   20u  IPv4 101994394      0t0  TCP localhost:34075->localhost:56220 (ESTABLISHED)
hugo      4042646 shaojiemike    9u  IPv4  99496788      0t0  TCP localhost:xtel (LISTEN)
ssh       4080263 shaojiemike    3u  IPv4 100792902      0t0  TCP snode6:40592->ec2-54-82-85-249.compute-1.amazonaws.com:ssh (ESTABLISHED)

$lsof
init          1        root  rtd       DIR                8,1     4096          2 /
init          1        root  txt       REG                8,1   150584     654127 /sbin/init

值得解释的参数:

  • COMMAND:进程的名称
  • FD:文件描述符,应用程序通过文件描述符识别该文件。
  • cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改。
  • txt 类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序。
  • 数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。
    • 由于初始打开每个应用程序时,都具有三个文件描述符,从 0 到 2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 FD 都是从 3 开始。
  • u 表示该文件被打开并处于读取/写入模式,而不是只读 r 或只写 (w) 模式。
    • 大写的W 表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例。
  • mem memory-mapped file;
  • rtd root directory;
  • TYPE:文件类型
  • REG 和 DIR分别表示文件和目录。
  • CHR 和 BLK,分别表示字符和块设备;
  • UNIX、FIFO 和 IPv4,分别表示 UNIX 域套接字、先进先出 (FIFO) 队列和网际协议 (IP) 套接字。
  • DEVICE:指定磁盘的名称
  • SIZE:文件的大小
  • NODE:索引节点(文件在磁盘上的标识)
  • NAME:打开文件的确切名称

常见用法

  • 打开文件的进程lsof abc.txt
  • 进程打开的文件
  • 根据进程名lsof -c abc
  • 根据PIDlsof -c -p 1234
  • 当前目录下被打开的文件lsof +d /usr/local/
  • 允许向下递归目录lsof +d /usr/local/
  • 筛选和网络相关的lsof -i默认打印所有网络相关的
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
  46 --> IPv4 or IPv6
  protocol --> TCP or UDP
  hostname --> Internet host name
  hostaddr --> IPv4地址
  service --> /etc/service中的 service name (可以不止一个)
  port --> 端口号 (可以不止一个)

常见用例

lsof -i UDP@[url]www.akadia.com:123 //显示那些进程打开了到www.akadia.com的UDP的123(ntp)端口的链接
lsof -i [email protected]:ftp -r //不断查看目前ftp连接的情况(-r,lsof会永远不断的执行,直到收到中断信号,+r,lsof会一直执行,直到没有档案被显示,缺省是15s刷新)

特殊端口替代符号

lsof -i :8080会用特殊的端口替换名称代替,常见的见文档

> sudo lsof -i  :8080
COMMAND      PID    USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
qbittorre 102376 chivier    9u  IPv6 257158435      0t0  TCP *:http-alt (LISTEN)

常见端口号 | 替换名称 | ---|---| |21|ftp| |22|ssh| |80|http| |8080|http-alt| |8090|http_alt_alt| |443|https

htop命令

  • 按键h?或者F1进说明界面,介绍快捷键hotkey
    • 注意大小写, 前面亮蓝色的F9 k代表F9k两按键都可以实现功能
    • u 可以指定用户的进程
    • H 显示或隐藏user线程
    • K 显示或隐藏kernel线程。 值得注意显示的PID,其实是PID或者TID(thread id)
    • e 可以打印环境变量
  • F5可以在两模式间切换
    • sort模式时,F6为SortBy可以选择排序方式
    • Tree模式时,F6为Collapse折叠子进程

常规设置以及解释

  • F2中布局设置如下(注意分成左右两大块)
    • "load average",它的意思是"系统的平均负荷",里面有三个数字,意思分别是1分钟、5分钟、15分钟内系统的平均负荷。当CPU完全空闲的时候,平均负荷为0;当CPU工作量饱和的时候,平均负荷为1。
    • 如果CPU每分钟最多处理100个进程,系统负荷1.7,意味着除了CPU正在处理的100个进程以外,还有70个进程正排队等着CPU处理。
    • 多核或者多CPU情况:n个CPU的电脑,可接受的系统负荷最大为n
  • F2中Dispaly options 除开隐藏用户态线程,其他建议全部勾选
  • F2中Columns设置每个进程显示的内容
  • 建议添加
    • STARTTIME
    • PPID 父进程PID
    • NLWP Number of threads in the process
  • 根据情况添加
    • 分析程序时间 user_time & system_time
    • 程序数据占用大小 M_LRS The library size of the process
    • IO读取的数据和速率 IO_RATE(需要sudo才能采集)

常用参数解释

START     PID    PPID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
  • PRIORITY
    • Kernel's internal priority for the process
  • NICE
    • Nice value (the higher the value,the more it lets other processes take priority)
    • 所以F7 Nice- 调高优先级,F8 Nice+ 降低优先级
  • PROCESSOR
    • Id of the CPU the process last executed on
  • M_SIZE
    • Total program size in virtual memory
    • 进程占用的虚拟内存值
  • M_RESIDENT
    • Resident set size,size of the text and data sections,plus stack usage
    • 进程占用的物理内存值
  • M_SHARE
    • Size of the process's shared pages
    • 进程占用的共享内存值
  • PERCENT_CPU
    • Percentage of the CPU time the process used in the last sampling (0~n)
  • PERCENT_MEM
    • Percentage of the memory the process is using, based on resident memory size
    • 该进程占用的物理内存和总内存的百分比
  • TIME
    • Total time the process has spent in user and system time
  • Status:
    • R: running;
    • S: sleeping;
    • T: traced/stopped;
    • Z: zombie;
    • D: disk sleep

常见用法

  • 先使用F4查找到进程名对应的PID,然后退出F4查找,直接输入pid可以知道其是否是僵尸进程

ip rule 与 ip route

传统路由

传统路由是基于目的地址来路由,如route命令。但是已经不再被使用。

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         0.0.0.0         0.0.0.0         U     0      0        0 warp
default         202.38.73.254   0.0.0.0         UG    0      0        0 eno0
  • 显示所有的流量都走名为warp的wireguard虚拟网卡。如果第一条wg的路由规则,所有流量原本应该走网关202.38.73.254
  • 参数基本说明
  • Metric 路由距离,到达指定网络所需的中转数,是大型局域网和广域网设置所必需的 (Linux内核不再使用)
  • Ref 是路由项引用次数 (Linux内核不再使用)
  • 相关Flags含义:
    • U 路由是活动的
    • G 需要经过网关
    • ! 拒绝路由
    • n 表示该路由是一个主机路由(而不是网络路由)
$ route -6
Kernel IPv6 routing table
Destination                    Next Hop                   Flag Met Ref Use If
[::]/0                         [::]                       !n   -1  1     0 lo

[::]/0                         2001:da8:d800:730::1       UG   1024 65     0 eno0
ip6-localhost/128              [::]                       Un   0   57     0 lo

以上是ipv6的相关输出

ip ro命令 ip route 命令

ip ro命令是ip route命令的缩写,默认显示的是ip route show table main也就是main 路由表

注意每个路由表的内容,如果满足几个路由规则,路由的优先级是按照匹配前缀最长的路由。而不是按照第一行优先于第二行。

root@tsjOp ~  [03:02:19]
> ip ro
default via 114.214.235.254 dev eth1  src 114.214.233.141
10.0.233.2 dev wg1 scope link
10.0.233.3 dev wg1 scope link
10.0.233.4 dev wg1 scope link
10.0.233.5 dev wg1 scope link
10.0.233.6 dev wg1 scope link
10.0.233.7 dev wg1 scope link
114.214.232.0/22 dev eth1 scope link  src 114.214.233.141
192.168.31.0/24 dev br-lan scope link  src 192.168.31.1

对于目的地址为10.0.233.2的信包,虽然也匹配default规则,但是32位全匹配10.0.233.2 dev wg1 scope link,所以最终选择wg1.

ip rule指令

Usage: ip rule [ list | add | del ] SELECTOR ACTION (add 添加;del 删除; llist 列表)

SELECTOR := [ from PREFIX 数据包源地址] [ to PREFIX 数据包目的地址] [ tos TOS 服务类型]
            [ dev STRING 物理接口] [ pref NUMBER ] [fwmark MARK iptables 标签]

ACTION := [ table TABLE_ID 指定所使用的路由表] [ nat ADDRESS 网络地址转换]
          [ prohibit 丢弃该表| reject 拒绝该包| unreachable 丢弃该包]

[ flowid CLASSID ]

TABLE_ID := [ local | main | default | new | NUMBER ]

查看指定ip的路由

root@tsjOp ~  [01:46:08]
> ip route get 20.205.243.166
20.205.243.166 via 114.214.235.254 dev eth1  src 114.214.233.141
root@tsjOp ~  [01:48:07]
> ip route show to match 20.205.243.166
default via 114.214.235.254 dev eth1  src 114.214.233.141

iptables

Linux 网络管理机制

在命令的学习和实践中,逐步学习。Linux系统是如何管理网络的。

node5 problem

$ ip route show table default
Error: ipv4: FIB table does not exist.
Dump terminated

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

我想写关于 linux 网络命令 ip iptables ufw 的相关文档来全面表述linux网络的构成和如何控制管理

参考文献

https://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316599.html

https://zhuanlan.zhihu.com/p/144585950

Wake Up Process

Linux 多进程的竞争休眠机制

基本是基于Linux的时间片轮转机制。A process/thread is woken up by inserting it in the queue of processes/threads to be scheduled.

内核调度算法

CFS(Completely Fair Scheduler)是一种用于 Linux 操作系统的调度算法,它旨在实现对 CPU 时间的公平分配。CFS 是 Linux 内核中默认的调度器,自 Linux 2.6.23 版本以来就成为了标准调度器。

CFS 调度算法的主要目标是确保各个任务在相同的时间片内能够获得公平的CPU时间,不会因为优先级等因素而造成资源争夺不均。以下是 CFS 调度算法的一些关键特点和原则:

  1. 虚拟化时钟: CFS 使用了一种称为虚拟化时钟(virtual runtime)的概念,而不是传统的时间片。每个任务都有一个虚拟运行时间,调度器根据虚拟运行时间来决定哪个任务应该被调度。

  2. 权重: CFS 引入了权重的概念,用于调整不同任务的相对优先级。较高权重的任务会在相同时间间隔内获得更多的虚拟运行时间,从而实现按比例分配CPU资源。

  3. 累积虚拟运行时间: 调度器会根据每个任务的权重和已累积的虚拟运行时间,计算出每个任务的应有的虚拟运行时间片。任务在使用完它的时间片后,会根据虚拟运行时间进行重新排队。

  4. 红黑树结构: CFS 使用红黑树来管理任务队列,这种数据结构使得在插入、删除和搜索任务时的时间复杂度保持在对数级别。

除了 CFS,Linux 内核还有其他调度算法,如:

  • 实时调度器(Real-Time Scheduler): 用于实时任务,提供硬实时和软实时的调度策略,确保实时任务在指定的时间内执行完成。

  • O(1) 调度器(O(1) Scheduler): 是 Linux 2.4 内核中使用的调度器,它的时间复杂度为常数级别。然而,随着多核系统的出现,O(1) 调度器在多核环境下的性能表现受到限制,因此被 CFS 替代。

这些调度算法在不同的场景和需求下,对于多任务操作系统的调度提供了不同的方法和策略。选择适合的调度算法可以根据系统的应用和性能要求来进行。

问题

在高强度竞争之后,有些进程陷入长期sleep,并且在核空闲的时候,也不再重新运行?为什么?

原因可能是程序逻辑阻塞了,或者在等待IO

查看进程Sleep的原因

首先 计算机对一个进程是如何判断sleep的,是某时间内的计算占比低于某个阈值吗?

htop s 可以查看kernel 是不是阻塞, l 可以查看是不是读写同一个文件导致阻塞了。

Sleep的瓶颈在哪里

sleep for what, waiting for what?

实践1 strace

strace -p PID 可以显示一些信息

$ strace -p 4005042
  wait4(-1, # 等待任意子进程结束

# check subprocess
$ pstree -p 4005042
pinbin(4005042)---BC_Compute(4005082)-+-{BC_Compute}(4005187)
                                      |-{BC_Compute}(4005188)
                                      |-{BC_Compute}(4005252)
                                      |-{BC_Compute}(4005296)
                                      |-{BC_Compute}(4005299)
                                      `-{BC_Compute}(4005302)

$ strace -p 4005082
strace: Process 4005082 attached
futex(0x7fffe52de1b8, FUTEX_WAIT, 2, NULL
# futex - fast user-space locking(seems to be used in OpenMP)
# It is typically used as a blocking construct in the context of shared-memory synchronization. 


$ strace -p 4005188
nanosleep({tv_sec=0, tv_nsec=2000000}, 0x7fffe5368bc0) = 0 # repeat
nanosleep({tv_sec=0, tv_nsec=2000000}, 0x7fffe536dbc0) = 0

It seems this is a subprocess repeating sleep leading to all other process to wait in the synchronization.

Use gdb -p PID to attach the process to locate the infinite loop (need Debug Symbols).

futex解释

futex 是 Linux 下的一个系统调用,用于实现用户空间线程间的同步和通信。让我们逐个解释这个系统调用中的每个参数的含义:

  1. 0x7fffe52de1b8: 这是一个指向内存地址的指针(或称为地址),通常是用于表示需要同步的资源或变量的地址。在这里,它表示需要等待的共享资源或变量的地址。
  2. FUTEX_WAIT: 这是一个指定 futex 要执行的操作的标志。FUTEX_WAIT 表示线程正在等待 futex 的值发生变化,即等待条件满足。当某个线程执行 FUTEX_WAIT 操作时,如果 futex 的值与预期不符,则该线程将被置于休眠状态,直到 futex 的值发生变化或超时。
  3. 2: 这是一个表示期望的 futex 值的参数。当调用 FUTEX_WAIT 时,线程将检查 futex 的当前值是否等于此参数指定的值。如果不等于,则线程将休眠等待。
  4. NULL: 这是一个指向 timespec 结构的指针,用于设置超时。这里为 NULL 表示调用没有设置超时,即线程将一直等待,直到 futex 的值发生变化。

总的来说,futex(0x7fffe52de1b8, FUTEX_WAIT, 2, NULL) 表示线程正在等待位于内存地址 0x7fffe52de1b8 的 futex 变量的值等于 2。如果 futex 的值不是 2,则线程将一直等待直到 futex 的值变为 2 或者超时。这样的同步机制在多线程编程中用于等待条件满足后再执行某些操作,从而避免资源竞争和提高程序的并发性能。

nanosleep解释

这是一个系统调用 nanosleep 的输出,通常用于让线程休眠一段时间。让我们逐个解释这个系统调用的含义:

nanosleep({tv_sec=0, tv_nsec=2000000}, 0x7fffe5368bc0) = 0
  1. nanosleep: 这是 Linux 下的一个系统调用,用于使线程休眠一段指定的时间。

  2. {tv_sec=0, tv_nsec=2000000}: 这是传递给 nanosleep 的第一个参数,是一个指向 timespec 结构的指针。timespec 结构用于表示时间间隔,包括秒(tv_sec)和纳秒(tv_nsec)。

在这里,tv_sec=0 表示秒数为 0,tv_nsec=2000000 表示纳秒数为 2000000。因此,这个 nanosleep 调用将会使线程休眠 2 毫秒(1 秒 = 1000000000 纳秒,所以 2000000 纳秒就是 2 毫秒)。

  1. 0x7fffe5368bc0: 这是传递给 nanosleep 的第二个参数,表示一个 timespec 结构的指针。这个参数用于存放未休眠完成的剩余时间,如果 nanosleep 被中断(例如收到信号),它将在这个指针中返回剩余的时间。在这个输出中,剩余时间被存储在内存地址 0x7fffe5368bc0 处。

  2. = 0: 这是 nanosleep 的返回值,表示成功完成。返回值为 0 表示 nanosleep 成功休眠了指定的时间。

综上所述,这个输出表示线程成功休眠了 2 毫秒。

实践2: zsim模拟程序

程序直接执行正常,zsim模拟直接sleep?

$ strace -p 303359
read(10,

$ pstree -p 303359                                                                                 gups_vanilla(303359)-+-gups_vanilla(303449)-+-orted+                                                                    |                      `-{gups+                                                                    |-{gups_vanilla}(303360)                                                                           |-{gups_vanilla}(303361)

$ pstree -p 303449                                                                                 gups_vanilla(303449)-+-orted(303451)-+-{orted}(303452)                                                                  |               |-{orted}(303642)                                                                  |               |-{orted}(303643)                                                                  |               `-{orted}(303644)                                                                  `-{gups_vanilla}(303450)

这是一个 Open MPI(Message Passing Interface)的启动命令,用于启动一个 MPI 程序,并配置一些运行时参数。让我们逐个解释这个命令中的每个选项和参数的含义:

orted --hnp --set-sid --report-uri 11 --singleton-died-pipe 12 -mca state_novm_select 1 -mca ess hnp -mca pmix ^s1,s2,cray,isolated

部分参数含义如下:

  • orted: 这是 Open MPI 的一个工具,用于启动和管理 MPI 进程。
  • -mca state_novm_select 1: 这是一个 MCA(Modular Component Architecture)选项,用于指定某个模块或组件的参数设置。在这里,state_novm_select 设置为 1,可能是指定某个组件或模块在运行时的选项。
  • -mca pmix ^s1,s2,cray,isolated: 这是另一个 MCA 选项,用于配置 PMIx(Process Management Interface for Exascale)的相关设置。^s1,s2,cray,isolated 表示排除 s1、s2、cray 和 isolated 这些模块,可能是禁用某些特定的组件或功能。
pid strace output explanation
303451 restart_syscall(<... resuming interrupted read ...>
303452 futex(0xabba001ec8, FUTEX_WAIT, 2, NULL
303642 epoll_wait(18, ... epoll_wait 系统调用,用于等待文件描述符18上的事件
303643 select(50, [48 49], NULL, NULL, 如下
303644 select(53, [51 52], NULL, NULL,
  • restart_syscall表示系统调用被中断后重新启动的过程。它通常出现在系统调用的执行过程中,当某个信号(例如 SIGSTOP 或 SIGCONT)中断了系统调用的执行,然后系统调用在信号处理完成后被重新启动。
  • select 是一个用于在多个文件描述符上进行 I/O 多路复用(I/O multiplexing)的系统调用,它可以监视多个文件描述符,并在其中任何一个文件描述符准备好进行 I/O 操作时返回。
  • select 调用的输出,它将监视文件描述符 48 和 49,并在其中任何一个文件描述符准备好读取数据或超时(2 秒后)时返回。
  • 完全无法理解呢! 可能需要深入了解MPI的实现栈细节才能明白。

命令行唤醒Sleep进程

The only way to “wake it up” is to arrange for the condition to be met. 用户是无法更改的状态的。

传统kill进程

# find pid , state S+ meaning sleep
ps aux | grep name
# gracefully kill process
kill -15 pid

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。

PPT acadamic figure

🏗施工中🏗

🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧

觉得有意义写,先占个位子。还没写好呢,建议不要看(逻辑内容都没想清楚),不要急~~

🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧

核心思想

画图是为了解释文字难以说清的事情。

  1. 明确要说明的观点和内容。需要时完整但是不复杂的内容,复杂的内容会导致内容的丢失。
  2. 明确需要图形化的对象(除开)
  3. 明确对象的重要性,越重要-> 越大、颜色越鲜艳、字体越粗。(大小如果是写实的就保持实际)
  4. 对象间的关系(通常用小字说明): 顺序大小关系(箭头),集合关系(花括号,虚实方框包裹)
  5. 保持画面和谐
  6. 对象的空间分布均匀,大小均匀,有层次。主要对象居中且保持对齐。
  7. 颜色有限,重点突出
  8. 最终效果:读者知道按照什么顺序看图,图形的关键是什么,作者想说明什么。

其实这些都是自然的东西,好像也不需要总结。

常见类型

  1. 流程图(只是展示理清每个关键步骤,还是更具体到每个步骤的核心实现方法)
  2. 实例说明图(抽象概念往往难以理解,实例说明更容易理解)
  3. 复杂概念的关系图

注意事项

图形的选择、大小和位置

  1. 虚实方框包裹 表示 弱或强的同类型关系

字体的选择、大小、位置、字体和粗细斜体

颜色

  1. 基本配色(统一的重要性关系): 红 > 黄 > 蓝/绿 > 灰/黑
  2. 颜色赋予的含义:红最重要, 黑色一般时baseline

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。

Overview of Compute system

“Those who cannot remember the past are condemned to repeat it.” —George Santayana, 1905
"Our technology,our machines,is part of our humanity.We created them to extend ourself,and that is what is unique about human beings. - Ray Kurzweil

Script: Email notifications when machine is free

outline

login to free SMTP server(qq, google) to send email to others.

send email using command line

  1. check ping mail.ustc.edu.cn
  2. MUST : set gmail open to support SMTP and apppassword
  3. or config qq email

IMAP, POP3 or SMTP

mailutils

According to ref1.

# install ca-certificates
# After new a google accounts, 
# config according to ref1
sudo apt-get install mailutils
$ echo "Hello world" | mail -s "Test" [email protected]

send but the same, more crazy thing is the -v and -d flag is not supported. and --debug-level=trace0 isn't recognized. many same question in StackOverflow

sudo tail -n 30 /var/log/mail.log or mail.error show more info.

ssmtp

We try ref2 ssmtp, sudo vim /etc/ssmtp/ssmtp.conf

TLS_CA_FILE=/etc/pki/tls/certs/ca-bundle.crt
root=[email protected]
mailhub=smtp.gmail.com:587
rewriteDomain=gmail.com
AuthUser=shaojieemail
AuthPass={apppassword}
FromLineOverride=YES
UseSTARTTLS=Yes
UseTLS=YES
hostname=snode6

The config get work but not well configed, e.g., TLS_CA_FILE

sending a email using gmail took about 13 mins.

$ ssmtp 943648187@qq.com < mail.txt
......
[->] Received: by snode6 (sSMTP sendmail emulation); Wed, 06 Sep 2023 15:42:05 +0800
[->] From: "Shaojie Tan" <[email protected]>
[->] Date: Wed, 06 Sep 2023 15:42:05 +0800
[->] test server email sending
[->]
[->] .
[<-] 250 2.0.0 OK  1693986323 5-20020a17090a1a4500b0026b4ca7f62csm11149314pjl.39 - gsmtp
[->] QUIT
[<-] 221 2.0.0 closing connection 5-20020a17090a1a4500b0026b4ca7f62csm11149314pjl.39 - gsmtp

sendmail

$ sendmail [email protected] < mail.txt
sendmail: Authorization failed (535 5.7.8  https://support.google.com/mail/?p=BadCredentials e7-20020a170902b78700b001c0c79b386esm8725297pls.95 - gsmtp)

get to work after well config gmail setting.

Speed Compare

command snode6 time(mins) icarus1
mail 4 1s
ssmtp 13
sendmail 6

send email by python

ref using QQ apppassword and python.

email notifications

  1. Create a Bash Script: Create a Bash script that checks the CPU usage and sends an email if it's below 30%. For example, create a file named cpu_check.sh:
#!/bin/bash

# Get CPU usage percentage
cpu_usage=$(top -b -n 1 | grep '%Cpu(s):' | awk '{print $2}' | cut -d'.' -f1)
echo "cpu_usage : ${cpu_usage} on $(hostname)"
# Check if CPU usage is below 30%
if [ "$cpu_usage" -lt 30 ]; then
   echo "beyond threshold : ${cpu_usage} on "
    # Send an email
    echo "CPU usage is ${cpu_usage} below 30% on $(hostname)" | mail -s "Low CPU Usage Alert on $(hostname)" [email protected]
fi

Make the script executable:

chmod +x cpu_check.sh

Modify [email protected] with your actual email address.

  1. Schedule the Script: Use the cron scheduler to run the script at regular intervals. Edit your crontab by running:
crontab -e

Add an entry to run the script, for example, every 5 minutes:

*/5 * * * * /staff/shaojiemike/test/cpu_check.sh >> /staff/shaojiemike/test/cpu_check.log
# Run every 15 minutes during working hours (9 am to 7 pm)
*/15 9-19 * * * /path/to/your/script.sh

Replace /path/to/cpu_check.sh with the actual path to your Bash script.

  1. Save and Exit: Save the crontab file and exit the text editor.

Now, the script will run every 5 minutes (adjust the cron schedule as needed) and send an email notification if the CPU usage is below 50%. You should receive an email when the condition is met.

Please note that this is a basic example, and you can modify the script to include more details or customize the notification further as needed. Additionally, ensure that your server is configured to send emails; you may need to configure SMTP settings for the mail or sendmail command to work correctly.

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

上面回答部分来自ChatGPT-3.5,没有进行正确性的交叉校验。

Conda

conda

Anaconda和Miniconda都是针对数据科学和机器学习领域的Python发行版本,它们包含了许多常用的数据科学包和工具,使得安装和管理这些包变得更加简单。

解决了几个痛点:

  1. 不同python环境的切换(类似VirtualEnv)
  2. 高效的包管理工具(类似pip,特别是在Windows上好用)

anaconda

Anaconda是一个全功能的Python发行版本,由Anaconda, Inc.(前称Continuum Analytics)提供。

  • 它包含了Python解释器以及大量常用的数据科学、机器学习和科学计算的第三方库和工具,如NumPy、Pandas、Matplotlib、SciPy等。
  • Anaconda还包含一个名为Conda的包管理器,用于安装、更新和管理这些库及其依赖项。
  • Anaconda发行版通常较大(500MB),因为它预装了许多常用的包,适用于不希望从头开始搭建环境的用户。

Miniconda

Miniconda是Anaconda的轻量级版本(50MB),它也由Anaconda, Inc.提供。

  • 与Anaconda不同,Miniconda只包含了Python解释器和Conda包管理器,没有预装任何其他包。这意味着用户可以根据自己的需求手动选择要安装的包,从而实现一个精简而高度定制化的Python环境。
  • 对于希望从零开始构建数据科学环境或需要更细粒度控制的用户,Miniconda是一个很好的选择。

Install miniconda

According to the official website,

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
# choose local path to install, maybe ~/.local
# init = yes, will auto modified the .zshrc to add the miniconda to PATH

# If you'd prefer that conda's base environment not be activated on startup,
#    set the auto_activate_base parameter to false:
conda config --set auto_activate_base false

you need to close all terminal(all windows in one section including all split windows), and reopen a terminal will take effect;

Python on windows

ref

创建虚拟环境

使用以下命令创建一个名为"myenv"的虚拟环境(您可以将"myenv"替换为您喜欢的环境名称):

conda create --name myenv python=3.8

# list existed env
conda env list

激活环境

conda activate name

环境包的生成和使用

conda list -e > requirements.txt
conda install --yes --file requirements.txt

pyproject.toml

$ pip install .
ERROR: Directory '.' is not installable. Neither 'setup.py' nor 'pyproject.toml' found.

在conda命令无效时使用pip命令来代替

while read requirement; do conda install --yes $requirement || pip install $requirement; done < requirements.txt

The double pipe (“||”) is a control operator that represents the logical OR operation. It is used to execute a command or series of commands only if the previous command or pipeline has failed or has returned a non-zero status code.

保存和复制conda环境的配置

conda env export > freeze.yml
conda env create -f freeze.yml

复制(fork)已有的环境

conda create -n 新环境名称 --clone 原环境名称 --copy

需要进一步的研究学习

暂无

遇到的问题

暂无

开题缘由、总结、反思、吐槽~~

参考文献

https://blog.csdn.net/Mao_Jonah/article/details/89502380