运维锅总详解计算机缓存溢出

news2024/11/26 10:41:04

本文尝试从缓存溢出、如何平衡防止缓存溢出和OOM、conntrack缓存满载影响及优化措施、TCP/IP协议栈缓存满载影响及优化措施等方面对计算机缓存溢出进行详细分析,最后给出一些缓存满载的Prometheus告警规则。希望对您有所帮助!

一、计算机缓存溢出简介

缓存溢出(Cache Overflow)是指缓存达到其容量极限后无法存储新的数据项的情况。为了讲解缓存溢出及其应对方法,以下将分为理论讲解和具体例子两部分。

理论讲解

1. 缓存溢出的原因
  • 缓存容量限制:缓存的存储空间有限,当数据量超过缓存容量时,新的数据无法直接存储。
  • 高数据访问率:在短时间内访问大量不同的数据,使缓存频繁替换。
  • 不合理的缓存配置:缓存大小设置不合理,未能有效应对数据访问需求。
2. 缓存替换策略

为了有效管理缓存溢出,缓存系统采用各种缓存替换策略来决定哪些数据应该被移出缓存。常见的缓存替换策略包括:

  1. 最近最少使用(LRU, Least Recently Used)

    • 原理:移出最久未被使用的数据项。假设最近使用的数据将来仍会被使用。
    • 优点:对时间局部性的数据访问模式表现良好。
    • 缺点:实现相对复杂,维护访问顺序需要额外的开销。
  2. 最少使用(LFU, Least Frequently Used)

    • 原理:移出使用频率最低的数据项。假设使用频率低的数据将来不会被频繁访问。
    • 优点:对频率局部性的数据访问模式表现良好。
    • 缺点:可能会导致长期不活跃但频繁使用的数据驻留缓存。
  3. 先进先出(FIFO, First In First Out)

    • 原理:移出最早进入缓存的数据项。假设先进入的数据最早被移出。
    • 优点:实现简单,不需要维护复杂的数据结构。
    • 缺点:可能会移出仍然活跃的数据。
  4. 随机替换(Random Replacement)

    • 原理:随机选择一个数据项进行移出。
    • 优点:实现简单,不需要额外的维护开销。
    • 缺点:效率低,无法利用访问模式的局部性。

具体例子

例子1:Web缓存(如浏览器缓存)
  • 场景:假设浏览器缓存的容量为100MB,当前已经缓存了95MB的数据。用户访问了一个新网站,这个网站的资源(图片、CSS、JavaScript等)需要5MB的缓存空间。
  • 处理
    • 如果浏览器使用LRU策略,最久未使用的缓存资源会被移出,腾出5MB空间来缓存新的资源。
    • 如果浏览器使用FIFO策略,最早进入缓存的资源会被移出,腾出空间。

示例代码(伪代码):

class BrowserCache {
    constructor(size) {
        this.size = size; // 缓存容量
        this.cache = new Map(); // 缓存存储
    }

    accessResource(url, resource) {
        if (this.cache.has(url)) {
            // 更新访问时间(LRU策略)
            const data = this.cache.get(url);
            this.cache.delete(url);
            this.cache.set(url, data);
        } else {
            // 添加新资源
            if (this.cache.size >= this.size) {
                // 移出最久未使用的资源
                const firstKey = this.cache.keys().next().value;
                this.cache.delete(firstKey);
            }
            this.cache.set(url, resource);
        }
    }
}
例子2:Redis缓存
  • 场景:Redis用于缓存数据库查询结果,缓存大小为50MB。用户不断查询新的数据,导致缓存空间不足。
  • 处理
    • 使用Redis配置LRU策略,Redis会自动移除最久未使用的数据项以腾出空间。

示例配置(Redis配置文件):

# 设置最大内存使用为50MB
maxmemory 50mb

# 配置LRU策略
maxmemory-policy allkeys-lru
例子3:操作系统文件系统缓存
  • 场景:操作系统缓存最近访问的文件块,以提高文件读取速度。文件系统缓存容量为1GB,当前已经使用了950MB。用户打开了一个新文件,需要读取50MB的数据块。
  • 处理
    • 操作系统使用LRU策略,将最久未访问的文件块移出缓存,以腾出空间。

示例(伪代码,描述LRU在文件系统缓存中的应用):

class FileSystemCache:
    def __init__(self, size):
        self.size = size  # 缓存容量
        self.cache = OrderedDict()  # 使用有序字典维护缓存

    def read_file_block(self, file, block):
        if (file, block) in self.cache:
            # 更新访问时间
            data = self.cache.pop((file, block))
            self.cache[(file, block)] = data
        else:
            # 读取新文件块
            if len(self.cache) >= self.size:
                # 移出最久未使用的文件块
                self.cache.popitem(last=False)
            data = self._read_from_disk(file, block)
            self.cache[(file, block)] = data
        return self.cache[(file, block)]

    def _read_from_disk(self, file, block):
        # 从磁盘读取文件块(模拟)
        return f"Data from {file} block {block}"

结论

缓存溢出是由于缓存容量限制和高数据访问率引起的常见问题。通过合理配置缓存大小,选择合适的缓存替换策略(如LRU、LFU、FIFO、随机替换)并监控缓存性能,可以有效管理缓存溢出,提升系统性能和稳定性。上述具体例子展示了不同场景下缓存溢出的处理方法,帮助理解缓存管理的实际应用。

二、如何平衡防止缓存溢出和OOM

在配置缓存以防止缓存溢出和避免OOM之间找到平衡点是一个复杂但重要的任务。可以从以下几个方面进行预防和优化:

1. 缓存大小配置

  • 估算缓存需求:根据应用的访问模式和数据量估算合理的缓存大小。避免设置过大或过小的缓存。
  • 动态调整缓存大小:监控实际使用情况,根据需要动态调整缓存大小。许多缓存系统支持这种配置。

2. 缓存替换策略

  • 选择合适的策略:不同的缓存替换策略(如LRU、LFU、FIFO)适用于不同的访问模式。选择适合应用场景的策略以提高缓存命中率,减少不必要的缓存替换。

3. 多层次缓存架构

  • 分层缓存:使用多层缓存架构(如L1、L2、L3缓存)来分散缓存压力。高频访问的数据存储在L1缓存,低频访问的数据存储在L2或L3缓存。
  • 示例:在Web应用中,可以使用浏览器缓存(L1)、应用服务器缓存(L2)和数据库缓存(L3)。

4. 分布式缓存

  • 分布式缓存系统:如Redis Cluster或Memcached分布式集群,分散缓存数据到多个节点上,减少单节点的内存压力。
  • 数据分区:将数据分区存储在不同的缓存节点上,避免单节点的缓存溢出。

5. 监控和报警

  • 实时监控:使用监控工具(如Prometheus、Grafana)实时监控内存使用、缓存命中率和系统性能。
  • 设置报警:配置内存使用和缓存命中率的报警,当内存使用接近限制时及时通知管理员。

6. 内存管理优化

  • 避免内存泄漏:确保应用程序中没有内存泄漏,定期检查和优化代码。
  • 高效的数据结构:使用高效的数据结构和算法,减少内存占用。
  • 压缩数据:在缓存中存储压缩数据,减少内存占用。

7. 垃圾回收调优

  • 调整GC参数:根据应用需求调整垃圾回收(GC)参数,确保内存的有效利用。
  • 选择合适的GC策略:不同的GC策略适用于不同的应用场景,如G1 GC、CMS等。

8. 使用限流和降级

  • 限流:在高负载情况下,对请求进行限流,避免过多的请求导致缓存溢出和OOM。
  • 降级:在系统负载过高时,进行功能降级,优先保证核心功能的正常运行。

Redis缓存配置策略

配置Redis缓存策略,包括单节点和集群配置,主要涉及设置最大内存限制和缓存驱逐策略。下面分别介绍如何在Redis单节点和Redis集群中配置这些缓存策略。

Redis 单节点配置

在Redis单节点中,可以通过配置文件redis.conf或运行时命令设置缓存策略。

1. 配置文件设置

编辑redis.conf文件:

# 设置最大内存使用限制
maxmemory 2gb

# 设置内存驱逐策略
# 可选策略:
# volatile-lru: 对设置了过期时间的key进行LRU(最近最少使用)驱逐
# allkeys-lru: 对所有key进行LRU驱逐
# volatile-lfu: 对设置了过期时间的key进行LFU(最不常用)驱逐
# allkeys-lfu: 对所有key进行LFU驱逐
# volatile-random: 对设置了过期时间的key进行随机驱逐
# allkeys-random: 对所有key进行随机驱逐
# volatile-ttl: 对设置了过期时间的key根据剩余TTL进行驱逐
# noeviction: 不进行驱逐,达到最大内存时返回错误
maxmemory-policy allkeys-lru
2. 运行时命令设置

使用redis-cli进行运行时配置:

# 连接到Redis实例
redis-cli

# 设置最大内存使用限制为2GB
CONFIG SET maxmemory 2gb

# 设置内存驱逐策略为allkeys-lru
CONFIG SET maxmemory-policy allkeys-lru
Redis 集群配置

在Redis集群中,每个节点的配置需要单独进行,但是可以通过脚本或配置管理工具(如Ansible、Chef等)来简化这一过程。以下是Redis集群配置缓存策略的步骤。

1. 配置文件设置

为每个Redis节点编辑redis.conf文件:

# 设置最大内存使用限制
maxmemory 2gb

# 设置内存驱逐策略
maxmemory-policy allkeys-lru

# 配置集群相关参数
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
2. 运行时命令设置

对集群中的每个节点使用redis-cli进行运行时配置:

# 连接到某个Redis节点
redis-cli -h <node-ip> -p <node-port>

# 设置最大内存使用限制为2GB
CONFIG SET maxmemory 2gb

# 设置内存驱逐策略为allkeys-lru
CONFIG SET maxmemory-policy allkeys-lru
3. 示例脚本

可以使用脚本来自动化配置集群中的所有节点。假设有3个节点,IP分别为192.168.1.1, 192.168.1.2, 192.168.1.3,端口均为6379

#!/bin/bash

NODES=("192.168.1.1" "192.168.1.2" "192.168.1.3")
PORT=6379
MAXMEMORY="2gb"
POLICY="allkeys-lru"

for NODE in "${NODES[@]}"; do
  echo "Configuring node $NODE:$PORT"
  redis-cli -h $NODE -p $PORT CONFIG SET maxmemory $MAXMEMORY
  redis-cli -h $NODE -p $PORT CONFIG SET maxmemory-policy $POLICY
done

echo "Configuration complete."
内存驱逐策略解释
  • volatile-lru: 对设置了过期时间的键使用LRU(最近最少使用)算法进行驱逐。
  • allkeys-lru: 对所有键使用LRU算法进行驱逐。
  • volatile-lfu: 对设置了过期时间的键使用LFU(最少使用频率)算法进行驱逐。
  • allkeys-lfu: 对所有键使用LFU算法进行驱逐。
  • volatile-random: 对设置了过期时间的键随机选择进行驱逐。
  • allkeys-random: 对所有键随机选择进行驱逐。
  • volatile-ttl: 根据键的TTL(剩余生存时间)进行驱逐,TTL最短的键优先驱逐。
  • noeviction: 不驱逐任何键,达到最大内存限制时返回错误。
结论

通过合理配置Redis单节点和集群的缓存策略,可以有效管理内存使用,防止缓存溢出和OOM。选择适合业务场景的内存驱逐策略(如LRU、LFU)以及合理设置最大内存限制,是确保Redis性能和稳定性的关键。持续监控和根据需求调整配置也是必不可少的。

Web 应用中的多层缓存

在一个大型 Web 应用中,可以使用多层缓存架构来分散压力。

浏览器缓存(L1)

浏览器缓存用于存储静态资源(如HTML、CSS、JavaScript、图片):

  • 配置示例

    <!-- 设置缓存控制头 -->
    <meta http-equiv="Cache-Control" content="max-age=3600">
    
应用服务器缓存(L2)

在服务器端使用缓存(如Memcached或Redis)来存储动态生成的内容:

  • Redis配置

    # 设置最大内存使用为500MB
    maxmemory 500mb
    
    # 配置LRU策略
    maxmemory-policy volatile-lru
    
    
    
数据库缓存(L3)

数据库层使用查询缓存来存储常用的查询结果:

  • MySQL 查询缓存
-- 启用查询缓存
SET GLOBAL query_cache_size = 1000000;
SET GLOBAL query_cache_type = 1;

分布式缓存系统

在一个分布式系统中,使用Redis Cluster来分散缓存压力。

  • Redis Cluster配置
# 创建Redis Cluster并配置分片
redis-cli --cluster create 192.168.1.1:6379 192.168.1.2:6379 192.168.1.3:6379 --cluster-replicas 1

Java 应用中的GC调优

通过调优JVM的GC参数来优化内存使用,防止OOM。

  • GC调优示例
# 启动Java应用并设置堆大小和G1 GC策略
java -Xms512m -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump -jar my_app.jar

Node.js 应用中的内存限制

使用内存限制和监控工具来防止Node.js应用中的OOM。

  • Node.js 内存限制

    # 启动Node.js应用并设置内存限制
    node --max-old-space-size=2048 app.js
    
  • 使用heapdump工具进行内存分析

    const heapdump = require('heapdump');
    
    // 生成堆转储文件
    heapdump.writeSnapshot('/path/to/snapshot.heapsnapshot', (err, filename) => {
      if (err) console.error(err);
      else console.log('Heap snapshot written to', filename);
    });
    
    

Spring Boot 应用中的缓存和内存管理

使用Spring Boot的缓存注解和配置内存限制来管理缓存和内存。

  • 缓存配置
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    @Cacheable("myCache")
    public String getData(String key) {
        // 从数据库或其他数据源获取数据
        return fetchDataFromDataSource(key);
    }

    private String fetchDataFromDataSource(String key) {
        // 模拟数据获取
        return "data for " + key;
    }
}
  • 应用内存限制application.properties):

    # 设置最大堆大小
    spring.datasource.hikari.maximum-pool-size=20
    

Python 应用中的缓存和内存管理

使用Python的cachetools库和内存限制来管理缓存和内存。

  • 缓存配置

    from cachetools import LRUCache, cached
    
    cache = LRUCache(maxsize=100)
    
    @cached(cache)
    def get_data(key):
        # 从数据库或其他数据源获取数据
        return fetch_data_from_data_source(key)
    
    def fetch_data_from_data_source(key):
        # 模拟数据获取
        return f"data for {key}"
    
    
  • 内存限制
import resource

# 设置最大内存限制(单位:字节)
resource.setrlimit(resource.RLIMIT_AS, (1024*1024*1024, 1024*1024*1024))  # 1GB

Linux 系统内存限制和监控

通过系统配置和监控工具来管理内存,防止OOM。

  • 系统内存限制/etc/security/limits.conf):

    # 为特定用户设置最大内存使用限制(单位:KB)
    username soft as 1048576  # 1GB
    username hard as 2097152  # 2GB
    
  • 使用vmstat监控内存使用

    # 实时监控内存使用
    vmstat 5
    

Kubernetes 中的内存限制

在Kubernetes环境中,为Pod配置内存限制来防止OOM。

  • Pod配置文件

    apiVersion: v1
    kind: Pod
    metadata:
    name: my-app
    spec:
    containers:
    - name: my-container
      image: my-image
      resources:
        requests:
          memory: "500Mi"
        limits:
          memory: "1Gi"
    

结论

通过以上具体的例子,可以看到在不同的应用场景下,通过合理配置缓存大小、选择合适的替换策略、使用多层缓存和分布式缓存、优化代码和数据结构、调优垃圾回收以及监控和限流,可以有效地平衡缓存溢出和OOM的问题,确保系统的稳定性和高性能。持续的监控和优化是关键,及时调整配置以应对不断变化的负载和需求。

三、conntrack缓存满载影响及优化措施

在TCP/IP协议栈中,conntrack(Connection Tracking)是一个重要的机制,用于跟踪网络连接的状态。它是netfilter的一部分,通常在Linux系统中用于网络地址转换(NAT)和防火墙规则管理。conntrack缓存的主要作用是跟踪每个网络连接的状态,以便正确处理数据包的流向和防火墙规则。

conntrack缓存满了,会发生以下几种情况:

1. 新的连接无法被跟踪

conntrack表满了,系统无法再为新的连接分配条目。这意味着新的连接请求可能会被拒绝或丢弃,导致以下情况:

  • 连接失败:客户端可能会遇到连接超时或拒绝连接的错误。
  • 丢包:新建立的连接请求数据包可能会被丢弃,因为没有足够的空间来记录连接状态。
2. 现有连接可能被丢弃

在某些情况下,如果conntrack表满了,系统可能会根据一定的策略丢弃较旧或不活跃的连接条目,以为新的连接腾出空间。这可能导致:

  • 中断:正在进行中的连接可能会被突然中断。
  • 状态丢失:连接的状态信息丢失,可能导致数据包处理不正确。
3. 网络性能下降

conntrack缓存接近满载时,系统可能会变得更加繁忙,处理网络流量的效率可能会下降。这可能会导致:

  • 延迟增加:由于缓存满载,数据包处理可能会变得更加缓慢。
  • 吞吐量下降:系统的整体网络吞吐量可能会降低。
4. 防火墙和NAT规则失效

conntrack用于实现许多网络功能,如NAT(网络地址转换)和防火墙规则。如果conntrack缓存满了,相关功能可能会失效:

  • NAT问题:NAT规则可能无法正确应用,导致网络地址转换错误。
  • 防火墙规则失效:防火墙规则可能无法应用到新的连接,导致安全风险。
解决方案和优化措施

为了避免conntrack缓存满的问题,可以采取以下措施:

1. 增加conntrack表的大小

可以通过调整conntrack表的最大大小来增加可跟踪的连接数。可以通过以下命令查看和设置conntrack的大小:

# 查看当前conntrack表的大小
sysctl net.netfilter.nf_conntrack_max

# 设置conntrack表的最大条目数为65536
sysctl -w net.netfilter.nf_conntrack_max=65536

可以将其添加到/etc/sysctl.conf中以使配置在重启后保持:

net.netfilter.nf_conntrack_max=65536
2. 优化连接超时设置

通过调整连接超时设置,确保不再活动的连接能更快地从conntrack表中移除。可以使用以下命令调整超时设置:

# 查看当前超时设置
sysctl net.netfilter.nf_conntrack_tcp_timeout_established

# 设置TCP连接的超时时间(例如,设置为5分钟)
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=300
3. 清理和监控
  • 监控conntrack表的使用情况

    cat /proc/net/nf_conntrack
    
  • 定期清理过期连接:使用脚本或工具定期检查并清理过期的连接条目。

4. 负载均衡和分布式处理

在高流量环境中,可以考虑使用负载均衡器或分布式系统来分散流量,减轻单个系统的压力。

总结

conntrack缓存满了,系统可能会遇到连接失败、现有连接丢失、网络性能下降和防火墙规则失效等问题。通过增加缓存大小、优化连接超时设置、监控和清理连接以及使用负载均衡等方法,可以有效预防和解决这些问题。

四、TCP/IP协议栈缓存满载影响及优化措施

在TCP/IP协议栈中,缓存的满载问题可能发生在多个层面,例如:

  1. TCP发送和接收缓存(Socket缓冲区)
  2. 网络接口卡(NIC)的发送和接收缓冲区
  3. 内核网络栈的处理缓存

1. TCP 发送和接收缓存

发送缓存满

TCP发送缓存(或称为发送缓冲区)用于存储待发送的数据。如果发送缓存满了,可能会导致以下问题:

  • 阻塞或延迟:应用程序在写入数据到套接字时,可能会被阻塞,直到缓存中有足够的空间。这会导致应用程序性能下降。
  • 数据丢失:在某些极端情况下,系统可能会丢弃数据并返回错误(如果SO_SNDBUF配置较小且缓存无法快速释放)。
  • TCP流量控制:TCP会通过流量控制机制来管理数据的发送速率。如果发送缓存满了,TCP流量控制会通知对端减少发送速率。

解决方案

  • 增加缓冲区大小:可以通过调整SO_SNDBUFSO_RCVBUF设置来增加发送和接收缓存的大小。
  • 优化应用程序:优化数据写入逻辑,避免一次性写入大量数据。
  • 网络优化:使用负载均衡和优化网络路径,减少延迟和带宽瓶颈。
接收缓存满

TCP接收缓存(或称为接收缓冲区)用于存储从网络中接收到的数据。如果接收缓存满了,可能会导致以下问题:

  • 数据丢失:如果应用程序无法及时读取缓存中的数据,接收缓存可能会溢出,导致数据丢失。
  • TCP拥塞控制:TCP会调整数据接收速率来避免接收缓存溢出。这会影响网络吞吐量和性能。

解决方案

  • 增加缓冲区大小:可以通过调整SO_RCVBUF设置来增加接收缓存的大小。
  • 优化数据处理:确保应用程序能够及时处理接收到的数据,避免缓存溢出。
  • 使用异步IO:使用非阻塞或异步IO模型,优化数据读取和处理效率。

2. 网络接口卡(NIC)缓存

网络接口卡(NIC)有其自己的发送和接收缓存。这些缓存用于暂时存储数据包,以便在网络接口上进行处理。

发送缓存满
  • 数据丢失:如果NIC的发送缓存满了,数据包可能会丢失或被丢弃,导致重传或网络延迟增加。
  • 网络拥塞:NIC缓存满了可能会导致网络拥塞,影响整个网络的性能。

解决方案

  • 增加NIC缓冲区大小:在硬件层面,选择高性能的NIC或调整其缓冲区配置(如果支持)。
  • 优化网络配置:确保网络路径和链路质量良好,避免瓶颈。
接收缓存满
  • 数据丢失:如果NIC的接收缓存满了,数据包可能会丢失,导致应用程序接收到的数据不完整。
  • 中断处理:NIC缓存满了可能会导致中断处理延迟,影响系统的网络性能。

解决方案

  • 增加NIC缓冲区大小:选择高性能的NIC或调整其接收缓冲区配置(如果支持)。
  • 优化系统处理能力:提高系统处理网络中断的能力,减少缓存溢出的风险。

3. 内核网络栈缓存

内核网络栈也有自己的缓存,用于存储处理中的网络数据。

缓存满
  • 数据丢失:如果内核网络栈缓存满了,可能会丢失数据包,影响网络通信。
  • 性能下降:缓存满了会导致系统性能下降,增加处理延迟。

解决方案

  • 调整内核参数:可以调整内核网络栈相关的参数,例如net.core.rmem_maxnet.core.wmem_max,以增加接收和发送缓存的大小。
  • 优化网络负载:使用负载均衡和流量管理技术,优化网络负载和缓存使用。

总结

当TCP/IP协议栈中的各种缓存满了时,可能会导致数据丢失、延迟增加、系统性能下降等问题。解决这些问题的方法包括:

  • 增加缓存大小:通过调整套接字缓冲区、NIC缓冲区和内核网络栈参数来增加缓存容量。
  • 优化应用程序和网络配置:提高数据处理效率和网络路径质量,避免缓存溢出。
  • 监控和调整:使用监控工具监控网络性能和缓存使用情况,根据需要进行调整。

通过合理配置和优化,可以有效减少缓存满载问题对系统性能的影响。

五、配置缓存用量告警举例

设置合理的告警阈值是防止缓存溢出和OOM的重要步骤。合理的阈值可以帮助系统管理员在问题发生之前及时采取措施。以下是一些设置告警阈值的示例,针对不同的缓存系统和使用场景:

1. Redis 缓存

Redis提供了多种监控指标,可以通过这些指标设置告警阈值。

示例:使用Prometheus和Grafana监控Redis
  • Redis监控指标

    • used_memory: 当前使用的内存量。
    • maxmemory: 配置的最大内存量。
    • evicted_keys: 因为内存限制被驱逐的键的数量。
  • Prometheus配置:配置Prometheus来抓取Redis的指标,并设置告警规则。

    # prometheus.yml
    
      scrape_configs:
    
        - job_name: 'redis'
          static_configs:
            - targets: ['localhost:9121']
    
    # alert.rules.yml
    
      groups:
    
        - name: redis_alerts
          rules:
            - alert: RedisMemoryUsageHigh
              expr: (redis_memory_usage_bytes / redis_memory_max_bytes) > 0.8
              for: 5m
              labels:
                severity: warning
              annotations:
                summary: "Redis memory usage is high"
                description: "Redis memory usage is above 80% for more than 5 minutes."
    
            - alert: RedisEvictedKeysHigh
              expr: redis_evicted_keys > 100
              for: 5m
              labels:
                severity: critical
              annotations:
                summary: "Redis evicted keys are high"
                description: "Redis evicted keys count is above 100 for more than 5 minutes."
    
    示例:Redis CLI监控和报警脚本

使用shell脚本和Redis CLI进行简单的监控和报警。

    #!/bin/bash
    # 配置Redis连接信息
    REDIS_HOST="localhost"
    REDIS_PORT="6379"
    MAX_MEMORY=2147483648  # 2GB
    # 获取当前内存使用量
    USED_MEMORY=$(redis-cli -h $REDIS_HOST -p $REDIS_PORT info memory | grep used_memory: | cut -d':' -f2)
    # 计算内存使用率
    MEMORY_USAGE=$(($USED_MEMORY * 100 / $MAX_MEMORY))
    # 检查内存使用率并发送报警
    if [ $MEMORY_USAGE -gt 80 ]; then
      echo "WARNING: Redis memory usage is above 80% ($MEMORY_USAGE%)"
      # 发送报警(可以集成报警系统,如邮件、Slack等)
    fi

2. Java 应用中的Ehcache

Ehcache是一个常用的Java缓存库,可以通过JMX进行监控。

示例:配置JMX监控和报警
  • Ehcache配置
    启用Ehcache的JMX监控。

     <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    
              xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
    
         <cache name="myCache"
                maxEntriesLocalHeap="1000"
                eternal="false"
                timeToIdleSeconds="300"
                timeToLiveSeconds="600"
                overflowToDisk="true"
                statistics="true">
         </cache>
    
         <managementRESTService enabled="true" bind="0.0.0.0:9888"/>
    
    </ehcache>
    
  • JMX监控脚本:使用JMX客户端(如JConsole或jmxtrans)来监控Ehcache,并设置告警规则。

      #!/bin/bash
    
    # 配置JMX连接信息
    
      JMX_HOST="localhost"
      JMX_PORT="12345"
    
    # 获取Ehcache内存使用信息
    
      HEAP_USAGE=$(jmxtrans -J-Dcom.sun.management.jmxremote.host=$JMX_HOST -J-Dcom.sun.management.jmxremote.port=$JMX_PORT -J-Dcom.sun.management.jmxremote.authenticate=false -J-Dcom.sun.management.jmxremote.ssl=false get -obj "net.sf.ehcache:type=CacheManager,name=myCache,Cache=myCache" -att MemoryStoreSize)
    
    # 计算内存使用率并发送报警
    
      if [ $HEAP_USAGE -gt 800 ]; then
    
        echo "WARNING: Ehcache memory usage is above 80%"
        # 发送报警(可以集成报警系统,如邮件、Slack等)
    
      fi
    

    3. Linux 系统缓存

监控Linux系统的内存使用情况,可以使用free命令获取内存使用信息,并设置报警阈值。

示例:使用Bash脚本监控系统内存
    #!/bin/bash

    # 获取内存使用信息
    MEM_INFO=$(free -m | grep Mem)
    TOTAL_MEM=$(echo $MEM_INFO | awk '{print $2}')
    USED_MEM=$(echo $MEM_INFO | awk '{print $3}')
    FREE_MEM=$(echo $MEM_INFO | awk '{print $4}')
    CACHED_MEM=$(echo $MEM_INFO | awk '{print $6}')

    # 计算内存使用率
    MEM_USAGE=$((($USED_MEM + $CACHED_MEM) * 100 / $TOTAL_MEM))

    # 检查内存使用率并发送报警
    if [ $MEM_USAGE -gt 80 ]; then
      echo "WARNING: System memory usage is above 80% ($MEM_USAGE%)"
      # 发送报警(可以集成报警系统,如邮件、Slack等)
    fi

4. Node.js 应用中的缓存

使用Node.js的memory-cache库进行内存缓存,并设置报警阈值。

示例:配置Node.js缓存监控和报警
  • 安装memory-cache库

    npm install memory-cache
    
  • 缓存配置和监控脚本

    const cache = require('memory-cache');
    const os = require('os');
    // 设置缓存
    cache.put('key1', 'value1', 60000);  // 缓存时间为60秒
    
    // 监控内存使用
    setInterval(() => {
        const totalMem = os.totalmem();
        const freeMem = os.freemem();
        const usedMem = totalMem - freeMem;
        const memUsage = (usedMem / totalMem) * 100;
    
        // 检查内存使用率并发送报警
        if (memUsage > 80) {
            console.log(`WARNING: Node.js memory usage is above 80% (${memUsage.toFixed(2)}%)`);
            // 发送报警(可以集成报警系统,如邮件、Slack等)
        }
    }, 5000);  // 每5秒检查一次
    

结论

通过设置合理的告警阈值,系统管理员可以在缓存溢出和OOM问题发生之前及时采取措施。以上示例展示了如何在不同的缓存系统和应用场景中配置监控和报警。持续监控和及时调整配置是关键,确保系统的稳定性和高性能。

六、一些缓存满载的告警规则

以下是涵盖网络、操作系统、内存和开源中间件的 Prometheus 告警规则,针对 OOM(Out of Memory)和缓存溢出问题,列出若干条告警规则。这些规则帮助监控系统的内存和缓存使用情况,预防和检测潜在的资源耗尽问题。

1. 操作系统内存告警规则

系统内存使用

Prometheus 查询

# 监控系统内存使用率
node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes > 0.9

告警规则

- alert: SystemMemoryUsageHigh
  expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes > 0.9
  for: 5m
  labels:
    severity: critical
  annotations:
    summary: "System memory usage is high"
    description: "System memory usage is above 90% of the total memory for more than 5 minutes."
系统交换区使用率

Prometheus 查询

# 监控系统交换区使用率
node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes / node_memory_SwapTotal_bytes > 0.9

告警规则

- alert: SwapMemoryUsageHigh
  expr: (node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes) / node_memory_SwapTotal_bytes > 0.9
  for: 5m
  labels:
    severity: critical
  annotations:
    summary: "Swap memory usage is high"
    description: "Swap memory usage is above 90% of the total swap space for more than 5 minutes."
系统内存碎片

Prometheus 查询

# 监控系统内存碎片
node_memory_MemFree_bytes / node_memory_MemTotal_bytes < 0.1

告警规则

- alert: SystemMemoryFragmentationHigh
  expr: node_memory_MemFree_bytes / node_memory_MemTotal_bytes < 0.1
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "System memory fragmentation is high"
    description: "System memory fragmentation is above 10% of the total memory for more than 5 minutes."

2. JVM内存告警规则

JVM堆内存使用率

Prometheus 查询

# 监控JVM堆内存使用率
jvm_memory_bytes_used{area="heap"} / jvm_memory_bytes_max{area="heap"} > 0.9

告警规则

- alert: JVMHeapMemoryUsageHigh
  expr: jvm_memory_bytes_used{area="heap"} / jvm_memory_bytes_max{area="heap"} > 0.9
  for: 5m
  labels:
    severity: critical
  annotations:
    summary: "JVM heap memory usage is high"
    description: "JVM heap memory usage is above 90% of the maximum limit for more than 5 minutes."
JVM非堆内存使用率

Prometheus 查询

# 监控JVM非堆内存使用率
jvm_memory_bytes_used{area="nonheap"} / jvm_memory_bytes_max{area="nonheap"} > 0.9

告警规则

- alert: JVMNonHeapMemoryUsageHigh
  expr: jvm_memory_bytes_used{area="nonheap"} / jvm_memory_bytes_max{area="nonheap"} > 0.9
  for: 5m
  labels:
    severity: critical
  annotations:
    summary: "JVM non-heap memory usage is high"
    description: "JVM non-heap memory usage is above 90% of the maximum limit for more than 5 minutes."
JVM垃圾回收时间

Prometheus 查询

# 监控JVM垃圾回收时间
jvm_gc_collection_seconds_sum / jvm_gc_collection_seconds_count > 0.1

告警规则

- alert: JVMGCOverhead
  expr: jvm_gc_collection_seconds_sum / jvm_gc_collection_seconds_count > 0.1
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "JVM GC overhead is high"
    description: "JVM garbage collection time is above 10% of total time for more than 5 minutes."

3. Redis缓存告警规则

Redis内存使用

Prometheus 查询

# 监控Redis的内存使用
redis_memory_used_bytes / redis_memory_max_bytes > 0.9

告警规则

- alert: RedisMemoryUsageHigh
  expr: redis_memory_used_bytes / redis_memory_max_bytes > 0.9
  for: 5m
  labels:
    severity: critical
  annotations:
    summary: "Redis memory usage is high"
    description: "Redis memory usage is above 90% of the maximum limit for more than 5 minutes."
Redis缓存命中率

Prometheus 查询

# 监控Redis的缓存命中率
redis_cache_hit_ratio < 0.9

告警规则

- alert: RedisCacheHitRatioLow
  expr: redis_cache_hit_ratio < 0.9
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "Redis cache hit ratio is low"
    description: "Redis cache hit ratio is below 90% for more than 5 minutes."
Redis慢查询

Prometheus 查询

# 监控Redis慢查询
rate(redis_command_duration_seconds_sum{command="slowlog"}[5m]) > 0.1

告警规则

- alert: RedisSlowQueries
  expr: rate(redis_command_duration_seconds_sum{command="slowlog"}[5m]) > 0.1
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "Redis slow queries detected"
    description: "Redis slow queries are above 0.1 requests per second for more than 5 minutes."

4. Memcached缓存告警规则

Memcached内存使用

Prometheus 查询

# 监控Memcached的内存使用
memcached_memory_used_bytes / memcached_memory_limit_bytes > 0.9

告警规则

- alert: MemcachedMemoryUsageHigh
  expr: memcached_memory_used_bytes / memcached_memory_limit_bytes > 0.9
  for: 5m
  labels:
    severity: critical
  annotations:
    summary: "Memcached memory usage is high"
    description: "Memcached memory usage is above 90% of the maximum limit for more than 5 minutes."
Memcached缓存命中率

Prometheus 查询

# 监控Memcached的缓存命中率
memcached_get_hits / (memcached_get_hits + memcached_get_misses) < 0.9

告警规则

- alert: MemcachedHitRatioLow
  expr: memcached_get_hits / (memcached_get_hits + memcached_get_misses) < 0.9
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "Memcached hit ratio is low"
    description: "Memcached hit ratio is below 90% for more than 5 minutes."
Memcached缓冲区使用

Prometheus 查询

# 监控Memcached的缓冲区使用
memcached_item_count / memcached_item_limit > 0.9

告警规则

- alert: MemcachedBufferHigh
  expr: memcached_item_count / memcached_item_limit > 0.9
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "Memcached buffer usage is high"
    description: "Memcached buffer usage is above 90% of the limit for more than 5 minutes."

5. Kafka缓存告警规则

Kafka日志积压

Prometheus 查询

# 监控Kafka的日志积压
kafka_server_log_log_size_bytes / kafka_server_log_log_segment_bytes > 0.9

告警规则

- alert: KafkaLogSizeHigh
  expr: kafka_server_log_log_size_bytes / kafka_server_log_log_segment_bytes > 0.9
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "Kafka log size is high"
 description: "Kafka log size is above 90% of the configured segment size for more than 5 minutes."


Kafka内存使用

Prometheus 查询

# 监控Kafka的内存使用
kafka_server_memory_usage_bytes / kafka_server_memory_limit_bytes > 0.9
监控Kafka的内存使用
kafka_server_memory_usage_bytes / kafka_server_memory_limit_bytes > 0.9

告警规则

- alert: KafkaMemoryUsageHigh
  expr: kafka_server_memory_usage_bytes / kafka_server_memory_limit_bytes > 0.9
  for: 5m
  labels:
    severity: critical
  annotations:
    summary: "Kafka memory usage is high"
    description: "Kafka memory usage is above 90% of the maximum limit for more than 5 minutes."

6. Nginx缓存告警规则

Nginx缓存使用

Prometheus 查询

# 监控Nginx的缓存使用
nginx_upstream_cache_bytes / nginx_upstream_cache_limit_bytes > 0.9

告警规则

- alert: NginxCacheUsageHigh
  expr: nginx_upstream_cache_bytes / nginx_upstream_cache_limit_bytes > 0.9
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "Nginx cache usage is high"
    description: "Nginx cache usage is above 90% of the configured limit for more than 5 minutes."
Nginx缓存命中率

Prometheus 查询

# 监控Nginx的缓存命中率
nginx_http_cache_hit_ratio < 0.9

告警规则

- alert: NginxCacheHitRatioLow
  expr: nginx_http_cache_hit_ratio < 0.9
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "Nginx cache hit ratio is low"
    description: "Nginx cache hit ratio is below 90% for more than 5 minutes."

7. Docker容器内存告警规则

Docker容器内存使用

Prometheus 查询

# 监控Docker容器内存使用
container_memory_usage_bytes / container_memory_limit_bytes > 0.9

告警规则

- alert: DockerContainerMemoryUsageHigh
  expr: container_memory_usage_bytes / container_memory_limit_bytes > 0.9
  for: 5m
  labels:
    severity: critical
  annotations:
    summary: "Docker container memory usage is high"
    description: "Docker container memory usage is above 90% of the limit for more than 5 minutes."
Docker容器文件描述符使用

Prometheus 查询

# 监控Docker容器的文件描述符使用
container_file_descriptors_used / container_file_descriptors_limit > 0.9

告警规则

- alert: DockerContainerFileDescriptorsHigh
  expr: container_file_descriptors_used / container_file_descriptors_limit > 0.9
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "Docker container file descriptors usage is high"
    description: "Docker container file descriptors usage is above 90% of the limit for more than 5 minutes."

8. PostgreSQL缓存告警规则

PostgreSQL缓存使用

Prometheus 查询

# 监控PostgreSQL的缓存使用
pg_buffercache_buffers_dirty / pg_buffercache_buffers_total > 0.9

告警规则

- alert: PostgreSQLBufferCacheHigh
  expr: pg_buffercache_buffers_dirty / pg_buffercache_buffers_total > 0.9
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "PostgreSQL buffer cache is high"
    description: "PostgreSQL buffer cache usage is above 90% of the total for more than 5 minutes."
PostgreSQL共享内存使用

Prometheus 查询

# 监控PostgreSQL的共享内存使用
pg_stat_activity_shared_buffers / pg_settings_shared_buffers > 0.9

告警规则

- alert: PostgreSQLSharedBuffersHigh
  expr: pg_stat_activity_shared_buffers / pg_settings_shared_buffers > 0.9
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "PostgreSQL shared buffers usage is high"
    description: "PostgreSQL shared buffers usage is above 90% of the configured limit for more than 5 minutes."

9. Tomcat缓存告警规则

Tomcat会话活跃数

Prometheus 查询

# 监控Tomcat的会话活跃数
tomcat_sessions_active_count / tomcat_sessions_max_count > 0.9

告警规则

- alert: TomcatSessionUsageHigh
  expr: tomcat_sessions_active_count / tomcat_sessions_max_count > 0.9
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "Tomcat session usage is high"
    description: "Tomcat session usage is above 90% of the maximum limit for more than 5 minutes."
Tomcat线程池使用

Prometheus 查询

# 监控Tomcat的线程池使用
tomcat_thread_pool_active / tomcat_thread_pool_max > 0.9

告警规则

- alert: TomcatThreadPoolHigh
  expr: tomcat_thread_pool_active / tomcat_thread_pool_max > 0.9
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "Tomcat thread pool usage is high"
    description: "Tomcat thread pool usage is above 90% of the maximum limit for more than 5 minutes."

10. Nginx流量告警规则

Nginx请求延迟

Prometheus 查询

# 监控Nginx的请求延迟
nginx_http_request_duration_seconds_sum / nginx_http_request_duration_seconds_count > 0.5

告警规则

- alert: NginxRequestLatencyHigh
  expr: nginx_http_request_duration_seconds_sum / nginx_http_request_duration_seconds_count > 0.5
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "Nginx request latency is high"
    description: "Nginx request latency is above 0.5 seconds for more than 5 minutes."
Nginx连接数

Prometheus 查询

# 监控Nginx的连接数
nginx_connections_active / nginx_connections_max > 0.9

告警规则

- alert: NginxConnectionsHigh
  expr: nginx_connections_active / nginx_connections_max > 0.9
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "Nginx active connections are high"
    description: "Nginx active connections are above 90% of the maximum limit for more than 5 minutes."

11. Docker容器文件系统告警规则

Docker容器文件系统使用

Prometheus 查询

# 监控Docker容器文件系统使用
container_fs_usage_bytes / container_fs_limit_bytes > 0.9

告警规则

- alert: DockerContainerFSUsageHigh
  expr: container_fs_usage_bytes / container_fs_limit_bytes > 0.9
  for: 5m
  labels:
    severity: critical
  annotations:
    summary: "Docker container file system usage is high"
    description: "Docker container file system usage is above 90% of the limit for more than 5 minutes."

12. 网络层告警规则

TCP连接数

Prometheus 查询

# 监控TCP连接数
node_netstat_Tcp_ActiveOpens / node_netstat_Tcp_Max > 0.9

告警规则

- alert: TCPConnectionsHigh
  expr: node_netstat_Tcp_ActiveOpens / node_netstat_Tcp_Max > 0.9
  for: 5m
  labels:
    severity: warning
  annotations:
    summary: "TCP active connections are high"
    description: "TCP active connections are above 90% of the maximum limit for more than 5 minutes."
TCP接收缓冲区使用

Prometheus 查询

# 监控TCP接收缓冲区使用
node_netstat_Tcp_RcvBuf / node_netstat_Tcp_RcvBufMax > 0.9

告警规则

- alert: TCPReceiveBufferHigh
  expr: node_netstat_Tcp_RcvBuf / node_netstat_Tcp_RcvBufMax > 0.9
  for: 5m
  labels:


 severity: warning
  annotations:
    summary: "TCP receive buffer usage is high"
    description: "TCP receive buffer usage is above 90% of the maximum limit for more than 5 minutes."

以上是关于 OOM 和缓存溢出的 Prometheus 告警规则示例,涵盖了不同层次和组件的监控需求。根据实际情况,可以调整告警阈值和规则,以适应特定环境和需求。

完。
在这里插入图片描述
希望对您有所帮助!关注锅总,及时获得更多花里胡哨的运维实用操作!

七、一个秘密

图片

锅总个人博客

https://gentlewok.blog.csdn.net/

锅总微信公众号

图片

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

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

相关文章

卫星轨道平面简单认识

目录 一、轨道平面 1.1 轨道根数 1.2 应用考虑 二、分类 2.1 根据运行高度 2.2 根据运行轨迹偏心率 2.3 根据倾角大小 三、卫星星座中的轨道平面 四、设计轨道平面的考虑因素 一、轨道平面 1.1 轨道根数 轨道平面是定义卫星或其他天体绕行另一天体运动的平面。这个平…

通过端口和进程pid查找启动文件/脚本

今天审计一个程序又让GPT给我上了一课&#xff0c;记一下笔记&#xff1a; 1、首先该程序开启了8080端口&#xff0c;使用如下命令得到pid为1817 netstat -tunlp|grep 80802、使用pid得到父进程 pstree -ps 1817输出结果如下&#xff1a; 3、看出程序是由systemd启动的&…

nginx安装演示(离线安装,直接安装在Linux中)

文章目录 1、创建文件夹 tool / nginx2、把安装文件放到 /opt/tool/nginx 目录下面3、yum install gcc4、yum install gcc-c5、tar -zxvf pcre-8.37.tar.gz6、./configure7、make8、make install9、tar -zxvf openssl-1.0.1t.tar.gz10、./config11、/config 1、创建文件夹 tool…

python绘制领域矩形

问题描述&#xff1a; 使用python书写代码实现以下功能&#xff1a;给定四个点的坐标&#xff0c;调用一个函数&#xff0c;可以使原来的四个点分别向四周上下左右移动15距离&#xff0c;分别记录下移动后的坐标&#xff0c;然后画出内侧矩形和外侧矩形 代码&#xff1a; im…

电脑为什么会提示丢失msvcp140.dll?怎么修复msvcp140.dll文件会靠谱点

电脑为什么会提示丢失msvcp140.dll&#xff1f;其实只要你的msvcp140.dll文件一损坏&#xff0c;然而你的电脑程序需要运用到这个msvcp140.dll文件的时候&#xff0c;就回提示你丢失了msvcp140.dll文件&#xff01;因为没有这个文件&#xff0c;你的很多程序都用不了的。今天我…

Purple Pi OH 更改SDK的编译选项

本文适用于在Purple Pi OH开发板更改SDK编译选项。触觉智能的Purple Pi OH鸿蒙开源主板&#xff0c;是华为Laval官方社区主荐的一款鸿蒙开发主板。 该主板主要针对学生党&#xff0c;极客&#xff0c;工程师&#xff0c;极大降低了开源鸿蒙开发者的入门门槛&#xff0c;具有以下…

数据为基 全面布局|美创再入《2024年中国网络安全市场全景图》

近日&#xff0c;网络安全行业研究机构数说安全正式发布《2024年中国网络安全市场全景图》&#xff08;以下简称全景图&#xff09;。 美创科技凭借以数据为中心的全面安全产品布局和领先能力&#xff0c;入榜数据库安全(数据库审计/数据库漏扫/数据库防火墙/数据库加密)、数据…

震撼发布!4M-21:苹果多模态AI巨擘,一键解锁21种模态

前沿科技速递&#x1f680; 来自洛桑联邦理工学院&#xff08;EPFL&#xff09;与苹果科研巨擘的强强联手&#xff0c;震撼发布全新跨时代成果——4M-21模型&#xff01;这一革命性单一模型&#xff0c;突破性地覆盖了数十种高度多样化的模态&#xff0c;通过大规模多模态数据集…

空状态页面设计的艺术与科学

空状态界面是用户在网站、APP中遇到的因无数据展示而中断体验的界面&#xff0c;这个界面设计对于解决用户疑惑有着很大的帮助。那么我们应该如何设计空状态界面呢&#xff1f;空状态是指在界面设计中&#xff0c;没有内容或数据时所显示的状态。它可能出现在各种情况下&#x…

Docker拉取失败,利用 Git将 Docker镜像重新打 Tag 推送到阿里云等其他公有云镜像仓库里

目录 一、开通阿里云容器镜像服务 二、Git配置 三、去DockerHub找镜像 四、编写images.txt文件 ​五、演示 六、其他注意事项 最近一段时间 Docker 镜像一直是 Pull 不下来的状态&#xff0c;想直连 DockerHub 是几乎不可能的。更糟糕的是&#xff0c;很多原本可靠的国内…

EasyExcel 单元格根据图片数量动态设置宽度

在使用 EasyExcel 导出 Excel 时&#xff0c;如果某个单元格是图片内容&#xff0c;且存在多张图片&#xff0c;此时就需要单元格根据图片数量动态设置宽度。 经过自己的研究和实验&#xff0c;导出效果如下&#xff1a; 具体代码如下&#xff1a; EasyExcel 版本 <depen…

Linux 内核 GPIO 用户空间接口

文章目录 Linux 内核 GPIO 接口旧版本方式&#xff1a;sysfs 接口新版本方式&#xff1a;chardev 接口 gpiod 库及其命令行gpiod 库的命令行gpiod 库函数的应用 GPIO&#xff08;General Purpose Input/Output&#xff0c;通用输入/输出接口&#xff09;&#xff0c;是微控制器…

防静电监控系统在电子制造业智能化转型中的应用价值

在电子制造业迅速向智能化转型的当下&#xff0c;防静电监控系统正发挥着日益重要的作用&#xff0c;其应用价值体现在多个关键方面。 一、ESD防静电监控系统简介 ESD防静电监控系统是对企业防静电设备&#xff08;机器、台垫、离子风机&#xff09;和人员进行实时监控、数据存…

c++之旅第十一弹——顺序表

大家好啊&#xff0c;这里是c之旅第十一弹&#xff0c;跟随我的步伐来开始这一篇的学习吧&#xff01; 如果有知识性错误&#xff0c;欢迎各位指正&#xff01;&#xff01;一起加油&#xff01;&#xff01; 创作不易&#xff0c;希望大家多多支持哦&#xff01; 一,数据结构…

Linux系统(CentOS)安装Mysql5.7.x

安装准备&#xff1a; Linux系统(CentOS)添加防火墙、iptables的安装和配置 请访问地址&#xff1a;https://blog.csdn.net/esqabc/article/details/140209894 1&#xff0c;下载mysql安装文件&#xff08;mysql-5.7.44为例&#xff09; 选择Linux通用版本64位&#xff08;L…

2024年保安员职业资格考试题库大数据揭秘,冲刺高分!

186.安全技术防范是一种由探测、&#xff08;&#xff09;、快速反应相结合的安全防范体系。 A.保安 B.出警 C.延迟 D.监控 答案&#xff1a;C 187.安全技术防范是以&#xff08;&#xff09;和预防犯罪为目的的一项社会公共安全业务。 A.预防灾害 B.预防损失 C.预防失…

昇思25天学习打卡营第5天 | 神经网络构建

1. 神经网络构建 神经网络模型是由神经网络层和Tensor操作构成的&#xff0c;mindspore.nn提供了常见神经网络层的实现&#xff0c;在MindSpore中&#xff0c;Cell类是构建所有网络的基类&#xff0c;也是网络的基本单元。一个神经网络模型表示为一个Cell&#xff0c;它由不同…

MobaXterm不显示隐藏文件

MobaXterm在左边显示隐藏文件&#xff0c;以.开头的文件&#xff0c;想让它不显示&#xff0c;点击红框按钮就可以了

计算机视觉——opencv快速入门(二) 图像的基本操作

前言 上一篇文章中我们介绍了如何配置opencv&#xff0c;而在这篇文章我们主要介绍的是如何使用opencv来是实现一些常见的图像操作。 图像的读取&#xff0c;显示与存储 读取图像文件 在opencv中我们利用imread函数来读取图像文件,函数语法如下&#xff1a; imagecv2.imre…

Python 可视化 web 神器:streamlit、Gradio、dash、nicegui;低代码 Python Web 框架:PyWebIO

官网&#xff1a;https://streamlit.io/ github&#xff1a;https://github.com/streamlit/streamlit API 参考&#xff1a;https://docs.streamlit.io/library/api-reference 最全 Streamlit 教程&#xff1a;https://juejin.cn/column/7265946243196436520 Streamlit-中文文档…