0%

oj运维笔记-持续更新

接到协会老师的任务,我负责了学校 oj 的开发和运维工作,这篇博客记录我在运维过程中遇到的一些问题和解决办法。

  • 重启容器 找不到 java,vi 等命令 使用 update update-alternatives —config 配置 java javac vi 等
  • java 遇到  OpenJDK 64-Bit Server VM warning: Can’t detect initial thread stack location - find_vma failed  错误原因是 chroot 系统中,需要挂载/proc,只需要执行以下语句即可
    mount -t proc none /proc
  • php 下载 excel 文件 nginx 报错 502
    首先查看 nginx 日志,发现在站点配置文件中没有设置输出日志,在站点配置文件末尾加入
    error_log logs/errors.log error;
    输入命令 nginx -t 发现报错
    nginx: [emerg] open() “/usr/share/nginx/logs/errors.log” failed (2: No such file or directory)
    使用 touch 创建日志文件,查看日志文件发现
    *4 upstream sent too big header while reading response header from upstream
    百度之后,说是 header 过大的问题,在 nginx.conf 的 http 段加入以下配置
    proxy_buffer_size 128k;
    proxy_buffers 32 32k;
    proxy_busy_buffers_size 128k;

      fastcgi_buffer_size 128k;
      fastcgi_buffers 4 256k;
      fastcgi_busy_buffers_size 256k;
    

    问题搞定!

    • 手动执行 judge_client
      judge_client 1000 1 /home/judge/hustoj_core debug
  • 当 v-if 与 v-for 一起使用时,v-for 具有比 v-if 更高的优先级

  • supervisor 的使用 运行命令 supervisorctl 然后参照配置文件的写法运行命令
  • docker-compose 要注意 services 不能重名,即使是在不同的目录下,如果 services 重名,会覆盖之前的容器,建议使用项目名+容器名进行命名

压力测试

因为使用 redis 缓存了问题数据,我想要测试一下有没有带来性能上提升
首先我尝试的是 postman 的 runner,但是测试之后发现并没有什么区别。后来了解到 postman 的 runner 是串行的。
又看到 jMeter 这个工具,但是它在 linux 下没有 GUI,配置又很繁琐,直接劝退。
之后又看到 linux 下几款 命令行压力测试工具,最终选择使用 ab。

ab 的使用

使用很简单,最基础的设置,请求 10000 次,并发数量 1000

1
ab -n 10000 -c 1000 http://localhost:8080/api/problem/1

socket: Too many open files (24)的解决办法

打开的文件太多了,超过了系统限制

1
ulimit -n 204800

redigo

文献 系统优点

nginx

nginx 容器配置反向代理,无法使用 localhost 访问主机,可以使用宿主机 docker 0 的网卡 ip 代替

mysql 相关

innodb_lock_wait_timeout 和 lock_wait_timeout
前者是 innodb 的 dml 操作的行级锁的等待时间 后面是数据结构 ddl 操作的锁的等待时间

减少锁等待时间,防止数据库卡死

set GLOBAL innodb_lock_wait_timeout = 50;
set GLOBAL lock_wait_timeout = 10;