一些 bios 配置优化的备忘

本文参考了华为的文档《FusionCompute V100R005C10 软件安装指南 02》,以下是我的一些笔记,不同设备的某些选项可能不同,仅供参考。

1. Intel HT technology,开启(Enable)

使CPU支持多线程,提升CPU性能。

image-20210602173907797

2. Intel Virtualization tech,开启(Enable)

image-20210602174640441

3. Execute Disable Bit,开启(Enable)

CPU硬件防病毒技术,亦称作NX或XD功能。

“Execute Disable Bit”是Intel在新一代处理器中引入的一项功能,开启该功能后,可以防止病毒、蠕虫、木马等程序利用溢出、无限扩大等手法去破坏系统内存并取得系统的控制权。

4. Intel SpeedStep tech,关闭(Disable)

speedstep 技术是通过降低 cpu 运行主频来达到降低功耗的技术,CPU 工作模式切换技术。

新款服务器写作 EIST(智能降频技术)。

· SpeedStep (GV1.1) 最早被引入奔腾M III,也就是笔记本电脑版奔腾。原理十分简单:双模式工作–全功率模式和省电模式。插上电源时,全速工作;电池供电时,已几乎一半主频工作(当然可以手动切回全速模式)。

· Enhanced SpeedStep (GV2.1) 加入了根据工作量自动在两个主频间切换的功能。实际上CPU就可以工作在三种模式下了:省电模式,性能优先模式和自动模式。

· Enhanced SpeedStep (GV2.2) 加入了Deep Alert mode。可以已更低的电压工作在省电模式下。

·EIST(Enhanced Intel SpeedStep Technology,GV3) 这版做出了巨大的改进,从此不再是只有两种频率可以选择了,而是有一个范围可以选择,通常以100MHz为一个步进(Step)。

来自CPU省电的秘密(一):EIST


linux 查找最近修改的文件

按时间查找可以使用参数:

  • -atime 访问时间
  • -ctime 改变状态的时间
  • -mtime修改的时间
find ./ -mtime 0 #返回最近24小时内修改过的文件。
find ./ -mtime 1 #返回的是前48~24小时修改过的文件,注意不是48小时以内修改过的文件。
find . -name '*.php' -mmin -30 #查找最近30分钟修改的当前目录下的.php文件
find . -name '*.inc' -mtime 0 -ls #查找最近24小时修改的当前目录下的.php文件,并列出详细信息

golang 创建错误

Golang 中的错误也是一种类型。错误用内置的 error 类型表示。源码定义如下:

// src/builtin/builtin.go

type error interface {
    Error() string
}

error 为 nil 代表没有错误。

error 创建方式有两种:

  • errors.New()
  • fmt.Errorf(),增加上下文的信息,更精确的描述错误。
err1 := errors.New("abcde")
err2 := fmt.Errorf("math: square root of negative number %g", x)

参考资料


kubernetes 开发之 client-go 学习

3月份已经记录了一些开发与 kubernetes 交互的文章,由于工期比较紧,虽然开发完成了,对client-go的学习还是不彻底。这一篇我记录一些我在 kubernetes 开发中的备忘。

访问 k8s 集群获取资源的几种方式:

  1. 命令行 kubectl

  2. http k8s REST API

  3. 代码库 client-go

    1. ClientSet

      ClientSet 可以对k8s的标准资源进行CURD

    2. Dynamic Client

      它能处理 kubernetes 所有的资源,控制所有的 API,处理CRD一般都是用它。请求返回的对象 unstructured.Unstructured 是一个 map[string]interface{}

    3. DiscoveryClient

      这是一种发现客户端,在前面的客户端中需要知道资源的 Resource 和 Version 才能找到你想要的,

      这些信息太多很难全部记住,这个客户端用于获取资源组、版本等信息。

    4. RESTClient

      最基础的客户端,对HTTP Request进行了封装,实现了RESTFul风格的API。

    5. informer

其中,ClientSet、DynamicClient、DiscoveryClient 都是基于 RESTClient 封装的。

一、背景

Kubernetes 官方从2016年8月份开始,将Kubernetes资源操作相关的核心源码抽取出来,独立出来一个项目Client-go,作为官方提供的Go client。

Kubernetes的 部分代码也是基于这个client实现的。

引入包:

go1.16+:

go get k8s.io/client-go@latest

go1.11+ 使用特定版本:

go get k8s.io/client-go@v0.20.4

更多内容参考官方安装手册

二、构造k8s配置文件,生成clientset和dynamic client

无论是使用 ClientSet 还是 Dynamic Client,第一步都是构建 k8s 的配置文件。

通过参数(master的url或者kubeconfig路径)和BuildConfigFromFlags方法来获取rest.Config对象。

kubeconfig路径一般路径为$HOME/.kube/config,用来配置本地连接的kubernetes集群。

package main

import (
    "fmt"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
	"k8s.io/client-go/dynamic"    
    "log"
    "os"
    "path/filepath"
)

// 从文件 ~/.kube/config 中构造config
func getConfigFromFile() (*restclient.Config, error){
    kubeconfig := filepath.Join(os.Getenv("HOME"), ".kube", "config")
    config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
    if err != nil {
        log.Fatal(err)
    }
    
    return config, err
}

const (
	// High enough QPS to fit all expected use cases.
	DefaultQPS = 1e6
	// High enough Burst to fit all expected use cases.
	DefaultBurst = 1e6

)

// 从数据库存储的多集群信息,包括masterIPkubeconfig和元数据信息中初始化,参考了[k8s多集群go-client实现](https://blog.csdn.net/weixin_43908373/article/details/95618989)

func InitClient(clusterName string) (*kubernetes.Clientset, *rest.Config, dynamic.Interface, error) {
	//数据库取出集群信息
	master, kubeconfig, err := GetClusterInfo(clusterName)
	if err != nil {
		logs.Error("get db for cluster kubeconfig error. %v ", err)
		return nil, nil, err
	}
	kubeconfigJson, err := yaml.YAMLToJSON([]byte(kubeconfig))
	if err != nil {
		logs.Error("yaml to json err")
	}
	configV1 := clientcmdapiv1.Config{}
	err = json.Unmarshal(kubeconfigJson, &configV1)
	if err != nil {
		logs.Error("json unmarshal kubeconfig error. %v ", err)
		return nil, nil, err
	}
	// 切换匹配的版本
	configObject, err := clientcmdlatest.Scheme.ConvertToVersion(&configV1, clientcmdapi.SchemeGroupVersion)
	if err != nil {
		logs.Error("ConvertToVersion error. %v ", err)
		return nil, nil, err
	}
	configInternal := configObject.(*clientcmdapi.Config)

	// 实例化配置信息
	clientConfig, err := clientcmd.NewDefaultClientConfig(*configInternal, &clientcmd.ConfigOverrides{
		ClusterDefaults: clientcmdapi.Cluster{Server: master},
	}).ClientConfig()

	if err != nil {
		logs.Error("build client config error. %v ", err)
		return nil, nil, err
	}
	clientConfig.QPS = defaultQPS
	clientConfig.Burst = defaultBurst
	
	// 实例化客户端
	clientSet, err := kubernetes.NewForConfig(clientConfig)

	if err != nil {
		logs.Error("(%s) kubernetes.NewForConfig(%v) error.%v", master, err, clientConfig)
		return nil, nil, err
	}
	
	dynamicClient, err := dynamic.NewForConfig(config)
	if err != nil {
		logrus.Error(err)
		return nil, nil, err
	}

	return clientSet, clientConfig, dynamicClient, nil
}

golang 文件路径相关操作

获取当前目录:

pwd, err := os.Getwd()

获取当前目录下的文件:

filepathNames, err := filepath.Glob(filepath.Join(pwd,"*"))

获取当前目录下的文件(包括子目录):

filepath.Walk(pwd,func(path string, info os.FileInfo, err error) error{
		fmt.Println(path) //打印path信息
		fmt.Println(info.Name()) //打印文件或目录名
		return nil
	})

参考资料


1 2 4 5 6 7 8 127 128