目录TencentOS_Tiny 任务栈使用率API调用在CONFIG.h中使能在任务中调用源码分析任务创建时对任务栈进行了初始化检测任务栈最多使用字节数
TencentOS_Tiny 任务栈使用率 在使用rtos时需要给任务分配合适大小的任务栈,任务运行时所占用的任务栈大小由整个任务所使用的临时变量多少决定,当任务不复杂且调用子函数不多时,可以通过简单的计算来判断需要给任务分配多大的任务栈。当任务比较复杂,调用函数比较多时,计算起来比较麻烦。TencentOS Tiny提供了API可以检测任务最多使用了任务栈多少字节,在使用最多字节的基础上多分配一部分空间,就是一个合适的任务栈大小。
API调用 在CONFIG.h中使能 TOS_CFG_TASK_STACK_DRAUGHT_DEPTH_DETACT_EN 1U 在任务中调用 int depth; tos_task_stack_draught_depth(&task1, &depth); printf(%d, depth); 源码分析 任务创建时对任务栈进行了初始化 在tos_task_creat()中使用了cpu_task_stk_init()函数对任务栈进行处理
__API__ k_err_t tos_task_create(k_task_t *task,char *name, k_task_entry_t entry, void *arg, k_prio_t prio, k_stack_t *stk_base, size_t stk_size, k_timeslice_t timeslice) { ....... ....... /* task_exist是提前声明的私有函数,用于销毁任务 * __STATIC__ void task_exit(void) * { * tos_task_destroy(K_NULL); * } */ task->sp = cpu_task_stk_init((void *)entry, arg, (void *)task_exit, stk_base, stk_size); task->entry = entry; task->arg = arg; task->prio = prio; task->stk_base = stk_base; task->stk_size = stk_size; strncpy(task->name, name, K_TASK_NAME_LEN_MAX); .
一般来说我们在linux服务器上面删除文件看起来是很快的,一个rm就把数据删除了
但是实际上,这个并没有真正的删除。
我们可以通过 lsof |grep deleted 我们可以看到文件其实还没完全删完的。
实际上还是可以读取的。
只有当一个文件的引用计数为0(包括硬链接数)的时候,才可能调用unlink删除,只要它不是0,那么就不会被删除。所谓的删除,也不过是文件名到 inode 的链接删除,只要不被重新写入新的数据,磁盘上的block数据块不会被删除,因此,你会看到,即便删库跑路了,某些数据还是可以恢复的。换句话说,当一个程序打开一个文件的时候(获取到文件描述符),它的引用计数会被+1,rm虽然看似删除了文件,实际上只是会将引用计数减1,但由于引用计数不为0,因此文件不会被删除。
参考:
https://mp.weixin.qq.com/s?__biz=MzI0MDQ4MTM5NQ==&mid=2247495456&idx=2&sn=e2907183c41ee6bd793fd01482c2309e&chksm=e9188a3cde6f032a3ab0782292376864c3777adf4fcaf74badaea5c21be0cabb9843f9916d45&token=35894323&lang=zh_CN#rd
Centos 7查看系统最近一次启动时间和运行时间 uptime命令 [root@localhost data]# uptime 19:42:03 up 6 days, 19:16, 4 users, load average: 0.00, 0.02, 0.05 查看/proc/uptime文件计算系统启动时间 [root@localhost data]# cat /proc/uptime 587887.18 1148867.44 输出587887.18 1148867.44第一数字即是系统已运行的时间587887.18秒,运用系统工具date即可算出系统启动时间
[root@localhost data]# date -d $(awk -F. '{print $1}' /proc/uptime) second ago +%Y-%m-%d %H:%M:%S 2022-04-07 00:25:11 查看/proc/uptime文件计算系统运行时间 [root@localhost data]# cat /proc/uptime| awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf(系统已运行:%d天%d时%d分%d秒,run_days,run_hour,run_minute,run_second)}' 系统已运行:6天19时25分15秒
1.简介 loam_velodyne是对LOAM代码做了整合,源码地址:https://github.com/laboshinl/loam_velodyne。
2.问题 在下载并编译好源码后,把launch文件里的雷达参数设为与采集数据的雷达参数一致,并检查代码中传输的消息类型是否与实验数据一致。 在此基础上遇到了两个错误:
错误1:process has died 如图所示: 解决方法:将loam_velodyne目录下的CMakeLists.txt的第35行注释掉: #add_definitions(-march=native) 参考链接:https://blog.csdn.net/LacyExsale/article/details/117391643 https://github.com/laboshinl/loam_velodyne/issues/71
错误2:Error transforming odometry 'Odometry' from frame '/camera_init' to frame 'camera_init' 这个问题是因为noetic中坐标系的写法问题,不能带/,把代码中的'/camera_init'改为'camera_init'即可。 参考链接:https://github.com/laboshinl/loam_velodyne/issues/157
ffmpeg在Linux上的安装 Ubuntu版本1604,ffmpeg版本为当前最
1,安装相关依赖库,执行以下指令:
sudo apt-get -y install autoconf automake build-essential libass-dev libfreetype6-dev libsdl2-dev libtheora-dev libtool libva-dev libvdpau-dev libvorbis-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev pkg-config texinfo zlib1g-dev #安装汇编库 sudo apt-get install yasm sudo apt-get install nasm 安装视频音频编解码库
sudo apt-get install libx264-dev sudo apt-get install libx265-dev sudo apt-get install libfdk-aac-dev sudo apt-get install libmp3lame-dev sudo apt-get install libopus-dev 2,FFmpeg安装
通过源码安装,需要先下载最新的源码:
cd ~/Desktop mkdir ffmpeg cd ffmpeg wget http://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 tar xjvf ffmpeg-snapshot.tar.bz2 cd ffmpeg 下载好后,就可以进行安装了,以安装在/opt/ffmpeg为例:
原文:Mysql 备份恢复与xtrabackup备份 - 惨绿少年 - 博客园 (cnblogs.com)
1.1 备份的原因 备份是数据安全的最后一道防线,对于任何数据丢失的场景,备份虽然不一定能恢复百分之百的数据(取决于备份周期),但至少能将损失降到最低。衡量备份恢复有两个重要的指标:恢复点目标(RPO)和恢复时间目标(RTO),前者重点关注能恢复到什么程度,而后者则重点关注恢复需要多长时间。
1.1.1 备份的目录 做灾难恢复:对损坏的数据进行恢复和还原
需求改变:因需求改变而需要把数据还原到改变以前
测试:测试新功能是否可用
1.1.2 备份中需要考虑的问题 可以容忍丢失多长时间的数据;
恢复数据要在多长时间内完;
恢复的时候是否需要持续提供服务;
恢复的对象,是整个库,多个表,还是单个库,单个表。
1.1.3 备份的类型 热备份:
这些动态备份在读取或修改数据的过程中进行,很少中断或者不中断传输或处理数据的功能。使用热备份时,系统仍可供读取和修改数据的操作访问。
冷备份:
这些备份在用户不能访问数据时进行,因此无法读取或修改数据。这些脱机备份会阻止执行任何使用数据的活动。这些类型的备份不会干扰正常运行的系统的性能。但是,对于某些应用程序,会无法接受必须在一段较长的时间里锁定或完全阻止用户访问数据。
温备份:
这些备份在读取数据时进行,但在多数情况下,在进行备份时不能修改数据本身。这种中途备份类型的优点是不必完全锁定最终用户。但是,其不足之处在于无法在进行备份时修改数据集,这可能使这种类型的备份不适用于某些应用程序。在备份过程中无法修改数据可能产生性能问题。
1.2 备份的方式 1.2.1 冷备份 最简单的备份方式就是,关闭MySQL服务器,然后将data目录下面的所有文件进行拷贝保存,需要恢复时,则将目录拷贝到需要恢复的机器即可。这种方式确实方便,但是在生产环境中基本没什么作用。因为所有的机器都是要提供服务的,即使是Slave有时候也需要提供只读服务,所以关闭MySQL停服备份是不现实的。与冷备份相对应的一个概念是热备份,所谓热备份是在不影响MySQL对外服务的情况下,进行备份。
冷备份及停止业务进行备份。
1.2.2 快照备份 首先要介绍的热备份是快照备份,快照备份是指通过文件系统支持的快照功能对数据库进行备份。备份的原理是将所有的数据库文件放在同一分区中,然后对该分区执行快照工作,对于Linux而言,需要通过LVM(Logical Volumn Manager)来实现。LVM使用写时复制(copy-on-write)技术来创建快照,例如,对整个卷的某个瞬间的逻辑副本,类似于数据库中的innodb存储引擎的MVCC,只不过LVM的快照在文件系统层面,而MVCC在数据库层面,而且仅支持innodb存储引擎。
LVM有一个快照预留区域,如果原始卷数据有变化时,LVM保证在任何变更写入之前,会复制受影响块到快照预留区域。简单来说,快照区域内保留了快照点开始时的一致的所有old数据。对于更新很少的数据库,快照也会非常小。
对于MySQL而言,为了使用快照备份,需要将数据文件,日志文件都放在一个逻辑卷中,然后对该卷快照备份即可。由于快照备份,只能本地,因此,如果本地的磁盘损坏,则快照也就损坏了。快照备份更偏向于对误操作防范,可以将数据库迅速恢复到快照产生的时间点,然后结合二进制日志可以恢复到指定的时间点。基本原理如下图:
1.2.3 逻辑备份(文本表示:SQL 语句) 冷备份和快照备份由于其弊端在生产环境中很少使用,使用更多是MySQL自带的逻辑备份和物理备份工具,这节主要讲逻辑备份,MySQL官方提供了Mysqldump逻辑备份工具,虽然已经足够好,但存在单线程备份慢的问题。在社区提供了更优秀的逻辑备份工具mydumper,它的优势主要体现在多线程备份,备份速度更快。
1.2.4 其他常用的备份方式 物理备份(数据文件的二进制副本)
全量备份概念
全量数据就是数据库中所有的数据(或某一个库的全部数据);
镜像下载、域名解析、时间同步请点击阿里云开源镜像站
VMware Workstation Pro 16 安装教程 笔者的运行环境:
VMware Workstation Pro 16
Red Hat Enterprise Linux 8.3.0
1、需要提前一个操作系统的镜像文件 ISO,这个文件与 VMware 无关。实际上,在安装完 VMware 之后,VMware 的目录(如 C:\Program Files (x86)\VMware\VMware Workstation)下已经有了一些镜像文件,但这些镜像文件往往不是自己想要的操作系统的镜像文件,所以还是需要单独下载。
2、笔者已经提前下载好了 Red Hat Enterprise Linux 8.3.0 的镜像文件 ISO,并保存在了本地文件夹。
Red Hat 下载的网址是:https://mirrors.aliyun.com/redhat/
3、VMware Workstation Pro 16 官方下载的网址是:https://www.vmware.com/cn.html
不过,也需要提前注册该网站的帐号。
下载的流程主要如下:
4、安装的流程比较简单,这里只给出关键性的步骤:
5、安装完成之后,运行该软件,将会弹出一个需要输入密钥的界面。笔者已经事先有了密钥,并保存在了本地文件夹。输入密钥之后就可以打开该软件了。
6、打开该软件之后,按如下操作即可。
7、注意,这里要选择的操作系统必须与前面下载的镜像文件一致。这里选择的是 Red Hat Enterprise Linux 8 64位:
8、按如下操作即可,直至完成。
9、完成虚拟机的创建之后,还需要导入前面下载的镜像文件:
10、现在,回到主界面点击 开启此虚拟机,即可安装或运行前面设置的虚拟操作系统了。
【注意】
如果选择安装 Windows,则还需要进行如下设置,镜像文件才会被正常加载。
11、好了,现在 VMware Workstation 的安装就已经完成了。
本文转自:https://blog.csdn.net/wangpaiblog/article/details/112152218
本章目录 0x00 数据持久化
1.RDB 方式 2.AOF 方式 如何抉择 RDB OR AOF? 0x01 备份容灾 一、备份
1.手动备份redis数据库 2.迁移Redis指定db-数据库 3.Redis集群数据备份与迁移 二、恢复
1.系统Redis用户被删除后配置数据恢复流程 2.Kubernetes中单实例异常数据迁移恢复实践 3.当Redis集群中出现从节点slave,fail,noaddr问题进行处理恢复流程。 前置知识学习补充 Redis数据库基础入门介绍与安装 - https://blog.weiyigeek.top/2019/4-17-49.html
Redis数据库基础数据类型介绍与使用 - https://blog.weiyigeek.top/2020/5-17-50.html
Redis基础运维之原理介绍和主从配置 - https://blog.weiyigeek.top/2019/4-17-97.html
Redis基础运维之哨兵和集群安装配置 - https://blog.weiyigeek.top/2019/4-17-576.html
Redis基础运维之在K8S中的安装与配置 - https://blog.weiyigeek.top/2019/4-17-524.html
Redis数据库性能测试及优化配置 - https://blog.weiyigeek.top/2019/4-17-527.html
Redis数据库客户端操作实践及入坑出坑 - https://blog.weiyigeek.top/2019/4-17-577.html
0x00 数据持久化 描述: Redis 是将数据存储在内存之中所以其读写效率非常高,但是往往事物都不是那么美好,当由于某些不可抗力导致机器宕机、redis服务停止此时您在内存中的数据将完全丢失;
所以为了使 Redis 在异常重启后仍能保证数据不丢失, 我们就需要对其进行设置持久化存储,使其将内存的数据通过某种方式存入磁盘中,当Redis服务端重启后便会从该磁盘中进行读取数据进而恢复Redis中的数据, 所以Redis数据持久化是容灾恢复必备条件;
Redis支持两种持久化方式:
(1) RDB 持久化(默认支持): 该机制是指在指定的时间间隔内将内存中数据集写入到磁盘; (2) AOF 持久化: 该机制将以日志的形式记录服务器所处理的每一个写操作,同时在Redis服务器启动之初会读取该文件来重新构建数据库,以保证启动后数据库中的数据完整; (3) 无持久化: 将 Redis 作为一个临时缓存,并将数据存放到memcached之中; Tips: 为保证数据安全性,我们可以设置 Redis 同时使用RDB和AOF持久化方式,来保证重启后Redis服务器中的数据完整;
RefAsync<int> total = 0; Db.Queryable<Order>().ToPageListAsync(pageIndex, pageSize, total); 由于异步情况不能出现ref 或者out等形式参数
所以参数为RefAsync<int>类型。
但是最后的返回值会出现total{value:0}
导致前台返回值需要在返回结果的基础上加上response.data.total.value
第二种方式将返回的结果先转成int类型,例如:
var result = Db.Queryable<Order>().ToPageListAsync(pageIndex, pageSize, total); int sum= total; return new {data = result;total = sum}
创建一个job job创建 begin sys.dbms_job.submit(job => 1, --代表的是号码,第几个定时任务 what => 'sys_mailing_list_job;', --这个是调用的你想使用的存储过程切记要打;不然会报错 next_date => to_date('20-08-2018 14:05:00', 'dd-mm-yyyy hh24:mi:ss'), --这个是下次调用的时间 interval => 'trunc(sysdate,''hh'')+(60+5)/(24*60)'); commit; --这个是间隔时间 。我这个代表的是每个小时的过5 比如 1:05,2:05,3:05...24小时的 end; 删除job: dbms_job.remove(jobno); – jobno就是你得任务号 修改要执行的操作: job:dbms_job.what(jobno, what); --指定任务号以及存储过程 修改下次执行时间:dbms_job.next_date(jobno, next_date); --指定任务号的时间 修改间隔时间:dbms_job.interval(jobno, interval); --指定任务号的间隔时间 启动job: dbms_job.run(jobno); --指定任务号启动 停止job: dbms.broken(jobno, broken, nextdate); –broken为boolean值 N代表启动,Y代表没启动(STOP) 创建一个dbms_job 新建一个表 create or replace table testTable( id number(32); name varchar2(10); ); 新建一个存储过程 create or replace procedure testTable_PRO is begin insert into testTable values{ id = 111, name ='测试' } end; 开始创建dbms_job1、2、(1)what的值是存储过程的名字(2)间隔的值是间隔的时间(也就是多久执行一次)(3)作业的值自动生成(4)下一个日期会自动生成也可以手动填写3、关于job运行的时间 关于job运行时间 关于job运行时间 1:每分钟执行 Interval => TRUNC(sysdate,'mi') + 1/(24*60) 2:每天定时执行 例如:每天的凌晨1点执行 Interval => TRUNC(sysdate) + 1 +1/(24) 3:每周定时执行 例如:每周一凌晨1点执行 Interval => TRUNC(next_day(sysdate,'星期一'))+1/24 4:每月定时执行 例如:每月1日凌晨1点执行 Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24 5:每季度定时执行 例如每季度的第一天凌晨1点执行 Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24 6:每半年定时执行 例如:每年7月1日和1月1日凌晨1点 Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24 7:每年定时执行 例如:每年1月1日凌晨1点执行 Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'), 12)+1/24 job的运行频率设置 1.