Nightingale 夜莺监控系统 - 监控篇(2)

Nightingale

Author:rab

官方文档:https://flashcat.cloud/docs/content/flashcat-monitor/categraf/3-configuration/


目录

    • 前言
    • 一、Categraf 配置文件
    • 二、Input 插件配置文件
      • 2.1 插件说明
      • 2.2 通用配置
        • 2.2.1 配置采集频率 interval
        • 2.2.2 配置采集实例 instances
        • 2.2.3 配置采集频率 interval_times
        • 2.2.4 配置采集标签 labels
      • 2.3 高级配置
        • 2.3.1 过滤指定采集指标
        • 2.3.2 采集指标添加前缀
        • 2.3.3 采集指标数据转换
        • 2.3.4 Categraf 自身指标采集
    • 三、常用插件
      • 3.1 基础指标采集
      • 3.2 mysql
      • 3.3 redis
      • 3.4 nginx
      • 3.5 net_response
      • 3.6 exec
    • 总结


前言

在部署篇中已经讲到了如何部署 n9e 的采集客户端(Categraf),这里不再重复,当然也不细说 Categraf 中的每个采集插件。这里只是告诉你,n9e 是如何监控(采集)数据的。

首先我们需要搞清楚 Categraf 的配置文件,以及一些常用采集的功能作用。Categraf 提供了一个采集框架,支持近百个指标采集插件,框架层面有一些通用的配置,比如 labels、interval 等,

我当前的 Categraf 版本为 0.3.45

一、Categraf 配置文件

Categraf 主配置文件放在conf目录下conf/config.toml

[global]
# 启动的时候是否在stdout中打印配置内容
print_configs = false# 机器名,作为本机的唯一标识,会为时序数据自动附加一个 agent_hostname=$hostname 的标签
# hostname 配置如果为空,自动取本机的机器名
# hostname 配置如果不为空,就使用用户配置的内容作为hostname
# 用户配置的hostname字符串中,可以包含变量,目前支持两个变量,
# $hostname 和 $ip,如果字符串中出现这两个变量,就会自动替换
# $hostname 自动替换为本机机器名,$ip 自动替换为本机IP
# 建议大家使用 --test 做一下测试,看看输出的内容是否符合预期
# 这里配置的内容,在--test模式下,会显示为 agent_hostname=xxx 的标签
hostname = ""# 是否忽略主机名的标签,如果设置为true,时序数据中就不会自动附加agent_hostname=$hostname 的标签
omit_hostname = false# 时序数据的时间戳使用ms还是s,默认是ms,是因为remote write协议使用ms作为时间戳的单位
precision = "ms"# 全局采集频率,15秒采集一次
interval = 15# 全局附加标签,一行一个,这些写的标签会自动附到时序数据上
# [global.labels]
# region = "shanghai"
# env = "localhost"[log]
# 默认的log输出,到标准输出(stdout) 
# 如果指定为文件, 则写入到指定的文件中
file_name = "stdout"# options below will not be work when file_name is stdout or stderr
# 如果是写入文件,最大写入大小,单位是MB
max_size = 100
# max_age is the maximum number of days to retain old log files based on the timestamp encoded in their filename.
# 保留多少天的日志文件
max_age = 1
# max_backups is the maximum number of old log files to retain.
# 保留多少个日志文件
max_backups = 1
# local_time determines if the time used for formatting the timestamps in backup files is the computer's local time.
# 是否使用本地时间
local_time = true
# Compress determines if the rotated log files should be compressed using gzip.
# 是否将老文件压缩(gzip格式)
compress = false# 发给后端的时序数据,会先被扔到 categraf 内存队列里,每个采集插件一个队列
# chan_size 定义了队列最大长度
# batch 是每次从队列中取多少条,发送给后端backend
[writer_opt]
# default: 2000
batch = 2000
# channel(as queue) size
chan_size = 10000# 后端backend配置,在toml中 [[]] 表示数组,所以可以配置多个writer
# 每个writer可以有不同的url,不同的basic auth信息
[[writers]]
# 注意端口号
# v5版本端口是19000
# v6版本端口是17000
url = "http://127.0.0.1:19000/prometheus/v1/write"# Basic auth username
basic_auth_user = ""# Basic auth password
basic_auth_pass = ""# timeout settings, unit: ms
timeout = 5000
dial_timeout = 2500
max_idle_conns_per_host = 100# 是否开启push gateway
[http]
enable = false
address = ":9100"
print_access = false
run_mode = "release"# 是否启用告警自愈agent
[ibex]
enable = false
## ibex flush interval
interval = "1000ms"
## n9e ibex server rpc address
servers = ["127.0.0.1:20090"]
## temp script dir
meta_dir = "./meta"# 心跳上报(附带资源信息,对象列表中使用)给夜莺v6
# 如果是v5版本,这里不需要保留
[heartbeat]
enable = true# report os version cpu.util mem.util metadata
url = "http://127.0.0.1:17000/v1/n9e/heartbeat"# interval, unit: s
interval = 10# Basic auth username
basic_auth_user = ""# Basic auth password
basic_auth_pass = ""## Optional headers
# headers = ["X-From", "categraf", "X-Xyz", "abc"]# timeout settings, unit: ms
timeout = 5000
dial_timeout = 2500
max_idle_conns_per_host = 100

以上是官方对 Categraf 主配置文件的解释,接下来就是对每个采集插件的配置了。

二、Input 插件配置文件

2.1 插件说明

插件的配置文件,放在conf目录,以input.打头conf/input.xxxx/xxx.toml

插件采集的指标默认都会添加一个前缀,比如 input.redis 采集的指标会以 redis_ 开头, input.mysql采集的指标会以mysql_开头。部分插件也支持自定义前缀,像 input.prometheus 和 input.exec 插件。

可以通过以下命令观察指标:

./categraf --test --inputs xxx # xxx:即你的插件名称
# 注意:这只是简单测试你这个插件是否能获取到数据,并不会上报n9e或n9e-edge

2.2 通用配置

2.2.1 配置采集频率 interval

每个插件的配置中,一开始通常都是 interval 配置,表示采集频率,如果这个配置注释掉了,就会复用主配置文件 config.toml 中的采集频率,这个配置如果配置成数字,单位就是秒,如果配置成字符串,就要给出单位,比如:

interval = 60
interval = "60s"
interval = "1m"

上面三种写法,都表示采集频率是1分钟,如果是使用字符串,可以使用的单位有:

  • 秒:s
  • 分钟:m
  • 小时:h
2.2.2 配置采集实例 instances

很多采集插件的配置中,都有 instances 配置段,用 [[]] 包住,说明是数组,即,可以出现多个 [[instances]] 配置段,比如 ping 监控的采集插件,想对4个IP做PING探测,可以按照下面的方式来配置:

[[instances]]
targets = ["www.baidu.com","127.0.0.1","10.4.5.6","10.4.5.7"
]

也可以下面这样子配置:

[[instances]]
targets = ["www.baidu.com","127.0.0.1"
][[instances]]
targets = ["10.4.5.6","10.4.5.7"
]
2.2.3 配置采集频率 interval_times

instances 下面如果有 interval_times 配置,表示 interval 的倍数,比如ping监控,有些地址采集频率是 15 秒,有些可能想采集的别太频繁,比如 30 秒,那就可以把interval配置成 15,把不需要频繁采集的那些 instances 的 interval_times 配置成 2

2.2.4 配置采集标签 labels

instances 下面的 labels 和 config.toml 中的 global.labels 的作用类似,只是生效范围不同,都是为时序数据附加标签,instances 下面的 labels 是附到对应的实例上,global.labels 是附到所有时序数据上

2.3 高级配置

2.3.1 过滤指定采集指标

拿 http_response 这个插件来做个演示,http_response.toml 的配置样例如下:

[[instances]]
targets = ["https://flashcat.cloud"
]

采集的数据如下:

ulric@192 categraf % ./categraf --test --inputs http_response
...
16:27:08 http_response_cert_expire_timestamp agent_hostname=192.168.10.121 method=GET target=https://flashcat.cloud 1688947199
16:27:08 http_response_response_code agent_hostname=192.168.10.121 method=GET target=https://flashcat.cloud 200
16:27:08 http_response_response_time agent_hostname=192.168.10.121 method=GET target=https://flashcat.cloud 0.227738958
16:27:08 http_response_result_code agent_hostname=192.168.10.121 method=GET target=https://flashcat.cloud 0

假设,我想 drop 掉以 timestamp 结尾的指标,可以这么配置:

[[instances]]
targets = ["https://flashcat.cloud"
]metrics_drop = ["*timestamp"]

重新测试,可以看到结果中少了 http_response_cert_expire_timestamp 这个指标了。metrics_drop 是个数组,每一项可以支持通配符。

那如果我只想保留以 timestamp 结尾的指标,忽略其他指标,应该怎么配置呢?样例如下:

[[instances]]
targets = ["https://flashcat.cloud"
]metrics_pass = ["*timestamp"]

重新测试,你会发现,结果中只有 http_response_cert_expire_timestamp 这一条指标了,另外 3 条指标则都被忽略了。

2.3.2 采集指标添加前缀

所有针对 flashcat.cloud 的探测指标,统一增加 ulricqin_ 的前缀:

[[instances]]
targets = ["https://flashcat.cloud"
]metrics_name_prefix = "ulricqin_"

测试结果如下:

16:37:39 ulricqin_http_response_response_time agent_hostname=192.168.10.121 method=GET target=https://flashcat.cloud 0.203779417
16:37:39 ulricqin_http_response_result_code agent_hostname=192.168.10.121 method=GET target=https://flashcat.cloud 0
16:37:39 ulricqin_http_response_cert_expire_timestamp agent_hostname=192.168.10.121 method=GET target=https://flashcat.cloud 1688947199
16:37:39 ulricqin_http_response_response_code agent_hostname=192.168.10.121 method=GET target=https://flashcat.cloud 200
2.3.3 采集指标数据转换

比如某些插件采集的数据可能是可枚举的字符串,字符串无法写入 Prometheus 生态的时序库,此时要把这些可枚举的字符串转换为数字。

[[processor_enum]]metrics = ["*status"][processor_enum.value_mappings]up = 1down = 0

这个意思是:针对 status 结尾的指标,采集到了两个值,一个是 up 一个是 down,都是字符串,然后通过 processor_enum 把字符串转换成了不同的数字。

2.3.4 Categraf 自身指标采集

即 Categraf 这个 Agent 服务自身的监控数据。

touch input.self_metrics/self_metrics.toml# 需手动创建self_metrics.toml文件(默认没有)

测试:

./categraf --test --inputs self_metrics

image-20240112222841424

开启后,categraf 会将自身的资源指标,包括cpu 内存使用量、打开了多少文件描述符、使用了多少 groutine、threads、gc 信息等推送到 remote write backend。

三、常用插件

3.1 基础指标采集

所谓基础指标采集,就是下载并安装好 Categraf 后,就自动为我们采集 CPU、内存、磁盘、磁盘IO、网络等。

涉及到的采集插件为:

  • cpu:采集cpu指标,包括cpu用户态/系统态使用量、中断、软中断等指标
  • mem:采集内存指标,包括内存使用量、总量、cache、buffer、 available等指标
  • disk:采集各个磁盘分区的空间/inode的使用量情况
  • diskio:采集磁盘io指标,包括读写速率,读写次数,读写延迟等
  • net:采集网络指标,包括网卡流量,包数,错误数等

这些基础监控在实际测试/生产都是有用的,保持默认足以。

3.2 mysql

1、功能

MySQL 监控采集插件,核心原理就是连到 MySQL 实例,执行一些 sql,解析输出内容,整理为监控数据上报。

场景:多实例 MySQL、主从等情况时,采集 Agent 端配置多个 [[instances]] 即可,如:

[[instances]]
address = "10.2.3.6:3306"
username = "root"
password = "1234"
labels = { instance="n9e-10.2.3.6:3306" }[[instances]]
address = "10.2.6.9:3306"
username = "root"
password = "1234"
labels = { instance="zbx-10.2.6.9:3306" }[[instances]]
...

2、案例

vim input.mysql/mysql.toml
[[instances]]
address = "10.xxx.xx.17:3306"
username = "root"
password = "xxxxxxxx"# # set tls=custom to enable tls
parameters = "tls=false"extra_status_metrics = true
extra_innodb_metrics = false
gather_processlist_processes_by_state = false
gather_processlist_processes_by_user = false
gather_schema_size = true
gather_table_size = false
gather_system_table_size = false
gather_slave_status = true# # timeout
timeout_seconds = 3# # interval = global.interval * interval_times
interval_times = 1# important! use global unique string to specify instance
labels = { instance="myn9e-10.206.0.17:3306" }
./categraf --test --inputs mysql# 会获取当前MySQL实例的所有库数据相关数据(innodb存储、bufferpool等)

3.3 redis

1、功能

慢日志、持久化大小等。

2、案例

vim conf/input.redis/redis.toml
[[instances]]
address = "127.0.0.1:6379"
username = ""
password = ""
pool_size = 2# 是否开启slowlog 收集
gather_slowlog = true
# 最多收集少条slowlog
slowlog_max_len = 100
# 收集距离现在多少秒以内的slowlog
# 注意插件的采集周期,该参数不要小于采集周期,否则会有slowlog查不到
slowlog_time_window=30

image-20240112225434629

3.4 nginx

1、功能

Nginx 作为 web 服务器、反向代理服务器时的数据采集。

2、案例 - 以简单的 web 为例

**条件一:**nginx服务需要启用http_stub_status_module模块

第三方模块下载地址:

nginx_upstream_check_module:https://github.com/yaoweibin/nginx_upstream_check_module

ngx_devel_kit-0.3.0:https://github.com/vision5/ngx_devel_kit/releases/tag/v0.3.0

lua-nginx-module-0.10.13:https://github.com/openresty/lua-nginx-module/releases/tag/v0.10.13

nginx-module-vts:https://github.com/vozlt/nginx-module-vts/releases

ngx-fancyindex-0.5.2:https://github.com/aperezdc/ngx-fancyindex/releases/tag/v0.5.2

# 推荐源码编译方式安装模块,如不清楚要安装哪些模块,可参考:
cd /opt/nginx-1.20.1 && ./configure \
--prefix=/usr/share/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib64/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/lib/nginx/tmp/client_body \
--http-proxy-temp-path=/var/lib/nginx/tmp/proxy \
--http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi \
--http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi \
--http-scgi-temp-path=/var/lib/nginx/tmp/scgi \
--pid-path=/var/run/nginx.pid \
--lock-path=/run/lock/subsys/nginx \
--user=nginx \
--group=nginx \
--with-compat \
--with-threads \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_mp4_module \
--with-http_random_index_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_v2_module \
--with-mail \
--with-mail_ssl_module \
--with-stream \
--with-stream_realip_module \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--with-select_module \
--with-poll_module \
--with-file-aio \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_perl_module=dynamic \
--with-stream=dynamic \
--with-mail=dynamic \
--with-http_xslt_module=dynamic \
--add-module=/etc/nginx/third-modules/nginx_upstream_check_module \
--add-module=/etc/nginx/third-modules/ngx_devel_kit-0.3.0 \
--add-module=/etc/nginx/third-modules/lua-nginx-module-0.10.13 \
--add-module=/etc/nginx/third-modules/nginx-module-vts \
--add-module=/etc/nginx/third-modules/ngx-fancyindex-0.5.2# 根据cpu核数
make -j2
make install# 注意:第三方模块nginx_upstream_check_module lua-nginx-module nginx-module-vts 都是相关插件所必备的依赖。

**条件二:**nginx 启用 stub_status 配置

vim /etc/nginx/conf.d/default.conf
server {listen       80;server_name  10.206.0.17;location / {root   /usr/share/nginx/html;index  index.html index.htm;}location /status {stub_status on;}
}

开始采集:urls 中写入你的 server_name + url

vim conf/input.nginx/nginx.toml
## collect interval
# interval = 15## Set the mapping of extra tags in batches
[mappings]
# "http://192.168.0.216:8000/nginx_status" = { "job" = "local" }
# "https://www.baidu.com/ngx_status" = { "job" = "baidu" }[[instances]]
## An array of Nginx stub_status URI to gather stats.
urls = ["http://10.206.0.17/status/"   # 在此处配置
]## append some labels for series
# labels = { region="cloud", product="n9e" }## interval = global.interval * interval_times
# interval_times = 1## Set response_timeout (default 5 seconds)
response_timeout = "5s"## Whether to follow redirects from the server (defaults to false)
# follow_redirects = false## Optional HTTP Basic Auth Credentials
#username = "admin"
#password = "admin"## Optional headers
# headers = ["X-From", "categraf", "X-Xyz", "abc"]## Optional TLS Config
# use_tls = false
# tls_ca = "/etc/categraf/ca.pem"
# tls_cert = "/etc/categraf/cert.pem"
# tls_key = "/etc/categraf/key.pem"
## Use TLS but skip chain & host verification
# insecure_skip_verify = false

相关参数解释:

curl http://127.0.0.1/status
Active connections: 1 
server accepts handled requests78 78 78 
Reading: 0 Writing: 1 Waiting: 0
# Nginx状态解释:
Active connections Nginx正处理的活动连接数5个
server Nginx启动到现在共处理了90837个连接。
accepts Nginx启动到现在共成功创建90837次握手。
handled requests Nginx总共处理了79582次请求。
Reading Nginx读取到客户端的 Header 信息数。
Writing Nginx返回给客户端的 Header 信息数。
Waiting Nginx已经处理完正在等候下一次请求指令的驻留链接,Keep-alive启用情况下,这个值等于active-(reading + writing)。
请求丢失数=(握手数-连接数)可以看出,本次状态显示没有丢失请求。

image-20240112230622452

3.5 net_response

1、功能

TCP 端口存活探测、TCP 网络延迟探测。

2、案例

vim input.net_response/net_response.toml
# # collect interval
# interval = 15[mappings]
# "127.0.0.1:22"= {region="local",ssh="test"}
# "127.0.0.1:22"= {region="local",ssh="redis"}[[instances]]
targets = [
#     "127.0.0.1:22",
#     "localhost:6379",
#     ":9090""127.0.0.1:9090"  # 此处添加
]# # append some labels for series
labels = { env="pre" }  # 标签# # interval = global.interval * interval_times
interval_times = 1## Protocol, must be "tcp" or "udp"
## NOTE: because the "udp" protocol does not respond to requests, it requires
## a send/expect string pair (see below).
protocol = "tcp"   # 协议## Set timeout
timeout = "15s"## Set read timeout (only used if expecting a response)
read_timeout = "15s"## The following options are required for UDP checks. For TCP, they are
## optional. The plugin will send the given string to the server and then
## expect to receive the given 'expect' string back.
## string sent to the server
# send = "ssh"
## expected string in answer
# expect = "ssh"
./categraf --test --inputs net_response

image-20240112235902553

3.6 exec

1、功能

如果input目录下的插件无法满足采集需求或者有特殊场景需要自定义实现指定业务的监控。

监控脚本采集到监控数据之后通过相应的格式输出到stdout,categraf截获stdout内容,解析之后传给服务端。

前面我们说了,exec 插件是支持自定义指标名称的,而其他插件都是以其插件名开头的。

2、数据格式

influx、prometheus、falcon

influx 格式

mesurement,labelkey1=labelval1,labelkey2=labelval2 field1=1.2,field2=2.3

influx格式说明

  • mesurement,定义指标名称(或者前缀),比如 connections;
  • mesurement后面是逗号,逗号后面是标签,如果没有标签,则mesurement后面不需要逗号
  • 标签是k=v的格式,多个标签用逗号分隔,比如region=beijing,env=test
  • 标签之后是空格
  • 空格之后是属性字段,多个属性字段用逗号分隔
  • 属性字段是字段名=值的格式,在categraf里只能是数字

最终,mesurement和各个属性字段名称拼接成metric名字。

falcon格式

[{"endpoint": "test-endpoint","metric": "test-metric","timestamp": 1658490609,"step": 60,"value": 1,"counterType": "GAUGE","tags": "idc=lg,loc=beijing"},{"endpoint": "test-endpoint","metric": "test-metric2","timestamp": 1658490609,"step": 60,"value": 2,"counterType": "GAUGE","tags": "idc=lg,loc=beijing"}
]

timestamp、step、counterType,这三个字段在categraf处理的时候会直接忽略掉,endpoint会放到labels里上报。

prometheus 格式

echo '# HELP demo_http_requests_total Total number of http api requests'
echo '# TYPE demo_http_requests_total counter'
echo 'demo_http_requests_total{api="add_product"} 4633433'

其中 # 注释的部分,其实会被 categraf 忽略,不要也罢。

这里要注意的是,标签值必须用双引号引起,否则报错,如果你的标签值是一个变量,你必须转义引号

echo "demo_http_requests_total{api=\"add_product\"} 4633433"

3、案例

编写脚本(这里以 prometheus 数据格式为例):

vim /opt/tools/test.sh
echo '# buyu service heartbeat'
echo 'proc_status{env="pro",servername="buyu"} 1'

开始采集:

vim conf/input.exec/exec.toml
# # collect interval
# interval = 15[[instances]]
# # commands, support glob
commands = ["/opt/tools/test.sh"
]# # timeout for each command to complete
# timeout = 5# # interval = global.interval * interval_times
# interval_times = 1# # choices: influx prometheus falcon
# # influx stdout example: mesurement,labelkey1=labelval1,labelkey2=labelval2 field1=1.2,field2=2.3
data_format = "prometheus"

image-20240112233044929

总结

还有很多很多采集插件(如日志采集插件 mtail,已经被集成到 Categraf 了),后续用到了继续分享!

—END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/617793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

word写标书的疑难杂症总结

最近在解决方案工作,与office工具经常打交道,各种问题,在此最下记录: 1.word中文档距离文档顶端有距离调整不了 1.疑难杂症问题1,多个空格都是不能解决 #解决办法:word中--布局-下拉框---“版式”--“垂直…

css3基础语法与盒模型

css3基础语法与盒模型 前言CSS3基础入门css3的书写位置内嵌式外链式导入式(工作中几乎不用)行内式 css3基本语法css3选择器标签选择器id选择器class类名原子类复合选择器伪类元素关系选择器序号选择器属性选择器css3新增伪类![在这里插入图片描述](https…

canvas设置渐变色文字(线性、径向)

查看专栏目录 canvas示例教程100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

gitee完整使用教程,创建项目并上传

目录 一 什么是gitee 二 安装Git 三 登录gitee,生成密钥 四 配置SSH密钥 五 创建项目 六 克隆仓库到本地 七 关联本地工程到远程仓库 八 添加文件 九 异常处理 十 删除仓储 十一 git常用命令 一 什么是gitee gitee是开源中国推出的基于git的代码托管服务…

Sqoop性能优化:高效数据传输的技巧

当使用Apache Sqoop进行数据传输时,性能优化至关重要。高效的数据传输可以减少任务运行时间,减轻集群负载,提高整体工作效率。在本文中,将深入探讨Sqoop性能优化的关键技巧,并提供丰富的示例代码,以帮助大家…

短视频账号矩阵剪辑分发系统技术源头开发

1.技术开发必备的开发文档说明: 1.1系统架构: 抖音SEO排名系统主要由以下几个模块组成: 1. 数据采集模块:负责采集抖音上的相关数据,包括视频、用户、话题等。 2. 数据处理模块:对采集到的数据进行处理&a…

使用斐波那契(Fibonacci)数列来测试各大语言的性能

笔者使用最多的语言是C,目前项目中在使用Go,也使用过不少其它语言,像Erlang,Python,Lua,C#等等。最近看到C#夺冠,首次荣获 TIOBE 年度编程语言,同时也看到网上有不少Java与C#之争的文…

【机器学习300问】4、机器学习到底在学习什么?

首先我们先了解一个前置问题,再回答机器学习到底在学习什么。 一、求机器学习问题有哪几步? 求解机器学习问题的步骤可以分为“学习”和“推理”两个阶段。首先,在学习阶段进行模型的学习,然后,在推理阶段用学到的模型…

匠心科技BLDC开发板原理图讲解

匠心科技BLDC开发板资料 链接:https://pan.baidu.com/s/1s5YjzRSDLKQvl86lBVAqKA?pwda6cx 提取码:a6cx 解压密码:JXKJ_RALDNWB站视频讲解() 链接: 匠心科技直流无刷电机开发板原理图讲解 BLDC的开发板主要分为四个模…

Linux的权限(1)

目录 操作系统的"外壳"程序 外壳程序是什么? 为什么存在外壳程序? 外壳程序怎么运行操作? 权限 什么是权限? 权限的本质? Linux中的(人)用户权限? su和su -的区别…

2024 1.6~1.12 周报

一、上周工作 论文研读 二、本周计划 思考毕业论文要用到的方法或者思想,多查多看积累可取之处。学习ppt和上周组会内容、卷积神经网络。 三、完成情况 1. 数据训练的方式 1.1 迁移学习 迁移学习是一种机器学习方法,把任务 A 训练出的模型作为初始模…

react 项目结构配置

1 项目整体目录结构的搭建 如下图: 2 重置css样式: normalize.css reset.less ; 第一步 安装 npm i normalize.css 入口文件index.tsx导入:import ‘noremalize.css’ 第二步 创建自己的css样式:在assets文件夹中创建css…

【设计模式-03】Strategy策略模式及应用场景

一、简要描述 Java 官方文档 Overview (Java SE 18 & JDK 18)module indexhttps://docs.oracle.com/en/java/javase/18/docs/api/index.html Java中使用到的策略模式 Comparator、comparable Comparator (Java SE 18 & JDK 18)declaration: module: java.base, pa…

web学习笔记(十五)

目录 1.Date对象 1.1日期对象的概念 1.2Date()方法的使用 1.3Date()常用方法汇总 1.4例题:用函数编写一个倒计时 2.函数 2.1函数的概念 2.2函数的使用 2.3函数的参数 2.4函数的声明 2.5函数的返回值 2.6异步函数 3特殊函数类型 3.1匿名函数 3.2箭头函数…

[Flutter] extends、implements、mixin和 abstract、extension的使用介绍说明

类创建:abstract(抽象类)、extension(扩展) 1.abstract(抽象类) dart 抽象类主要用于定义标准,子类可以继承抽象类,也可以实现抽象类接口。抽象类通过abstract 关键字来…

【软件测试】学习笔记-静态测试方法

这篇文章详细讨论人工静态测试方法和自动静态测试方法,来帮你理解研发流程上是如何保证代码质量的,以及如何搭建自己的自动静态代码扫描方案,并且应用到项目的日常开发工作中去。 人工静态方法本质上属于流程上的实践,实际能够发…

QEMU源码全解析 —— PCI设备模拟(7)

接前一篇文章: 上一回讲解了pci_edu_realize函数中的pci_register_bar函数,本回开始对于edu设备的MMIO读写函数进行解析。 操作系统与PCI设备交互的主要方式是PIO和MMIO。MMIO虽然是一段内存,但是其没有EPT映射,在虚拟机访问设备…

Smallpdf扫描、转换、压缩、编辑、签名PDF

【应用名称】:Smallpdf: 扫描、转换、压缩、编辑、签名PDF 【适用平台】:#Android 【软件标签】:#Smallpdf 【应用版本】:1.71.0 【应用大小】:150MB 【软件说明】:通过 Smallpdf,您可以&…

数据结构 模拟实现二叉树(孩子表示法)

目录 一、二叉树的简单概念 (1)关于树的一些概念 (2)二叉树的一些概念及性质 定义二叉树的代码: 二、二叉树的方法实现 (1)createTree (2)preOrder (…

资源三号03星-立体测绘卫星星座

资源三号03星作为我国民用高分辨率立体测图卫星资源三号系列的第三颗卫星,在资源三号02星技术状态的基础上进行了继承和适当优化,设计寿命由资源三号02星的5年延长至8年,星上搭载了三线阵立体测绘相机、多光谱相机和业务化应用的激光测高仪&a…