4月
30
在 docker
容器中运行 python 项目时,报 RuntimeError: Found no NVIDIA driver on your system. Please check that you have an NVIDIA GPU and installed a driver from http://www.nvidia.com/Download/index.aspx 错误,这个时候需要 docker 开启 nvidia engin 的支持。至少电脑是装了 nvidia 的显卡的。
docker 中启用 nvidia:
https://blog.vini123.com/1206
4月
30
在 docker 中,docker-compose.yaml
配置了 nvida 参数时,执行 docker-compose up -d
时报docker: Error response from daemon: unknown or invalid runtime name: nvidia 错误。
如果是非 win 系统,修改 /etc/docker/daemon.json
,并添加以下配置。
{
"runtimes": {
"nvidia": {
"path": "nvidia-container-runtime",
"runtimeArgs": []
}
},
"default-runtime": "nvidia"
}
然后重启 docker。
如果是 win 系统,需要手动打开 docker 桌面应用,点击右上角的设置,进入 docker engine 项进行配置。配置内容也是和上边的一样。如下截图。
4月
26
goframe 生成不重复的 7 位数字,并和数据库 user 表中字段不重复
func generateUniqueID() int {
src := rand.NewSource(time.Now().UnixNano())
min := 1000000
max := 10000000
return rand.New(src).Intn(max-min) + min
}
func generateUniqueViewID(ctx context.Context) (int, error) {
for {
viewId := generateUniqueID()
id, err := dao.Users.Ctx(ctx).Where(do.Users{Viewid: viewId}).Fields("id").Value()
if err != nil {
return 0, err
}
if id == nil {
return viewId, nil
}
}
}
4月
26
随着 AI 聊天的兴起,流式展现数据的需求变得更常见。前端 EventSource 的使用频率也会更高。接openai,文心一言,通义千问这些接口,并以流式的方式在页面展现出来。就得自己的接口服务端也以流式的方式返回给自己的前端,自己的服务器端接它们,让它们也要以流的方式返回。这个时候服务端不仅要做接口的对接和数据的转发,还得做数据的解析和存储。
这里前端以 vue3,后端使用 laravel 的方式,来简单介绍下怎么搞。
前端 API 选择
https://developer.mozilla.org/zh-CN/docs/Web/API/EventSource
前端选择 fetch,并没有选择 EventSource。
因为 fetch 本身就可以支持 EventSource 的方式接受数据,使用方式也会像使用 axios 类似。而单纯 EventSource 的使用会收到请求方式,不能自定义Header头,连接数目等方式的限制。fetch 就像在调用接口,EventSource 就像是 websocket。
EventSource 示例:
const sse = new EventSource("/api/v1/sse");
sse.addEventListener("notice", (e) => {
console.log(e.data);
});
sse.addEventListener("update", (e) => {
console.log(e.data);
});
sse.addEventListener("message", (e) => {
console.log(e.data);
});
4月
18
docker 中运行 mysql 8.2,默认情况下,会占用 400M 左右的内存。运行两个就双倍。对于那种便宜的阿里云1核1G或2G的服务器,很容器就卡死。这个时候,就需要设置设置,降低 mysql 的内存消耗了。
其实,一个 mysql 占用 400M 内存,为什么要在一台服务器上装那么多呢。可以对 mysql 进行单独编排,然后通过同一网络的方式,让其他容器也都能访问这个 mysql 就可以了。出现前边那种局面往往是一个完整的项目会有 mysql,redis,php,python,java 等环境构成,而这些构成又放在一个 compose.yaml 中进行编排。那么多个项目后,就会出现多个重复的进程了。虽然对于磁盘空间不会多份重复,内存是在重复增长的。这个时候,设计项目组合的时候就需要考虑考虑。所以想单独剥离 mysql 出来。
可以使用 htop
命令来查看服务器的 cpu,内存使用情况。
可以使用 docker stats
来查看容器使用 cpu, 内存的情况。
优化使用 mysql 内存
新建 my.cnf 文件 ,位置是这样的 ./conf/mysql/my.cnf 。填充下边的代码。
[mysqld]
performance_schema_max_table_instances=400
# 缓存
table_definition_cache=400
# 用于监控MySQL server 在一个较低级别的运行过程中的资源消耗、资源东西
performance_schema=off
# 打开表的缓存
table_open_cache=64
# InnoDB缓冲池大小调整操作的块大小
innodb_buffer_pool_chunk_size=64M
# InnoDB 存储引擎的表数据和索引数据的最大内存缓冲区大小
innodb_buffer_pool_size=64M
在 compose.yaml 中,增加 volume,配置如下。
mysql:
……
volumes:
……
- ./conf/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
ports:
- 3306:3306
然后重启 myslq。
docker-compose restart mysql
然后查看内存使用情况进行对比。
多个项目公用一个 mysql
可以给 mysql 进行单独编排,设置好网络。可以将该网络设置为主网络,其他容器可以通过 external 的方式公用同一个网络。这样各个容器间就方便通信了。
4月
11
win10 系统,安装 docker,然后跑 php 项目,通常会很慢,一个最简单接口都可能要好几秒,真叫人肝疼。改变不了 win10,只能找解决方法。
处理方法
慢的原因网上有很多,怎么解决网上也很多,也实践过。不过,有一条是真的快。将代码放在 ubuntu 系统上跑,就是快。
步骤:
- 先安装 Ubuntu。
- 再安装 docker。
- 设置 docker 。
设置 docker 如下图所示。
-
win + r 输入 \\wsl$
回车,打开 wsl 目录。或在资源管理器中打开 wsl 目录。这里要进入 Ubuntu 目录。然后将代码复制到 Ubuntu 系统中。比如将 docker-compose
相关的 service
放在 /docker-data
下。
-
进入 ubuntu 中。执行 docker-compose up -d
,把服务跑起来。
这个时候再去请求 php 的接口就飞快。
4月
09
买了个 99 元的阿里云,最近经常卡死。通过 htop,可以看到是 /usr/bin/dnf makecache 占用 cpu 太高。
尝试处理
关闭 CentOS 的后台更新服务
systemctl stop dnf-makecache.timer
systemctl disable dnf-makecache.timer
后续
运行了许多天后,又卡死了。使用 htop 查看,发现是阿里云的监控煮助手。好吧,把监控助手也搞掉。
先干掉监控助手的守护进程。
# 停止云助手守护进程
/usr/local/share/assist-daemon/assist_daemon --stop
# 卸载云助手守护进程
/usr/local/share/assist-daemon/assist_daemon --delete
# 删除云助手守护进程目录
rm -rf /usr/local/share/assist-daemon
再来干掉监控助手。
# 查询您的ECS实例是否使用systemd初始化进程服务,有返回信息则表示使用的是systemd
strings /sbin/init | grep "/lib/system"
# 停止云助手Agent
systemctl stop aliyun.service
# 卸载云助手Agent
sudo rpm -qa | grep aliyun_assist | xargs sudo rpm -e
参考
https://blog.csdn.net/kunyus/article/details/106861400
https://help.aliyun.com/zh/ecs/user-guide/start-stop-or-uninstall-the-cloud-assistant-agent
https://help.aliyun.com/zh/ecs/user-guide/start-stop-or-uninstall-the-cloud-assistant-agent#section-ge4-ads-7ud
https://ivpsr.com/3914.html
4月
08
https://www.meilisearch.com/docs/learn/cookbooks/laravel_scout
构建 laravel 项目使用的工具不是 Sail 时。按照官方文档 https://laravel.com/docs/11.x/scout 来安装和使用 Scout 时,发现会报错。
cURL error 7: Failed to connect to 127.0.0.1 port 7700 after 0 ms: Couldn't connect to server (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for http://127.0.0.1:7700/indexes/resources/documents?primaryKey=id"
我这里使用的是 docker 环境。出现这个的原因是没有启动 meilisearch 服务。如果使用 sail 构建时,其会包含 meilisearch 服务。所以在这里,自己手动构建好 meilisearch 服务就可以了。docker-compose.yaml 配置如下:
meilisearch:
image: getmeili/meilisearch:latest
container_name: meilisearch_latest
ports:
- "7700:7700"
environment:
- MEILI_MASTER_KEY=masterKey
- MEILI_NO_ANALYTICS=true
volumes:
- ./data/meilisearch:/var/lib/meilisearch
restart: always
其中,masterKey 为秘钥,可以自定义。
然后 laravel 的 .env 文件中,可以增加以下配置。
SCOUT_DRIVER=meilisearch
MEILISEARCH_HOST=http://meilisearch:7700
MEILISEARCH_KEY=masterKey
其他按照官方文档来就可以了。
4月
07