跳转到内容
Doc Record

Blog

java.lang.OutOfMemoryError : unable to create new native Thread

终端窗口
# 使用此命令查看正在运行的线程数
ps -elfT | wc -l
ps -elfT | grep appName|wc -l
# 要获取进程正在运行的线程数(可以使用 top 或 ps aux 获取进程 pid):
ps -p <PROCESS_PID> -lfT | wc -l
# 查找哪些进程正在创建线程
ps huH
# 用户可以拥有的线程数量是有限制的。可以通过“最大用户进程数”行进行检查
ulimit -a
# /proc/sys/kernel/threads-max 文件提供系统范围内的线程数限制。 root 用户可以更改该值
# 要更改限制(在本例中为 4096 个线程):
ulimit -u 4096
# 使用 jps 列出所有 java 进程(只需在 shell 中执行 jps )并使用每个 Ghost 进程的 kill -9 pid bash 命令分别杀死它们时,它就解决了。
jps

postgresql表死锁问题的排查方式_PostgreSQL_脚本之家

这篇文章主要介绍了postgresql表死锁问题的排查方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

1.查询激活的执行中的sql,查看有哪些更新update的sql。

select * from pg_stat_activity where state = ‘active’;

2. 查询表中存在的锁

select a.locktype, a.database, a.pid, a.mode, a.relation, b.relname from pg_locks a join pg_class b on a.relation = b.oid where lower(b.relname) = ‘h5_game’;

3. 杀掉死锁进程

select pg_terminate_backend(pid) from pg_stat_activity where state = ‘active’ and pid != pg_backend_pid() —and pid = 14172 and pid in (select a.pid from pg_locks a join pg_class b on a.relation = b.oid where lower(b.relname) = ‘news_content’)

锁模式

/* NoLock is not a lock mode, but a flag value meaning “don’t get a lock” */ #define NoLock 0

#define AccessShareLock 1 /* SELECT / #define RowShareLock 2 / SELECT FOR UPDATE/FOR SHARE / #define RowExclusiveLock 3 / INSERT, UPDATE, DELETE / #define ShareUpdateExclusiveLock 4 / VACUUM (non-FULL),ANALYZE, CREATE * INDEX CONCURRENTLY / #define ShareLock 5 / CREATE INDEX (WITHOUT CONCURRENTLY) / #define ShareRowExclusiveLock 6 / like EXCLUSIVE MODE, but allows ROW * SHARE / #define ExclusiveLock 7 / blocks ROW SHARE/SELECT…FOR * UPDATE / #define AccessExclusiveLock 8 / ALTER TABLE, DROP TABLE, VACUUM * FULL, and unqualified LOCK TABLE */

补充:Postgresql死锁的处理

背景:

对表进行所有操作都卡住,原因可能是更新表时导致这个表死锁了,开始进行排查

解决一:查询pg_stat_activity有没有记录

Section titled “解决一:查询pg_stat_activity有没有记录”

pg版本10.2

select pid,query,* from pg_stat_activity where datname=‘死锁的数据库’ and wait_event_type = ‘Lock’; select pg_cancel_backend(‘死锁那条数据的pid值’);##只能杀死select 语句, 对其他语句不生效 pg_terminate_backend(‘死锁那条数据的pid值’);#select,drop等各种操作

执行后发现select和delete表时正常执行,但truncate和drop表时会一直运行,也不报错。

“drop table” 和 “truncate table” 需要申请排它锁”ACCESS EXCLUSIVE”, 执行这个命令卡住时,说明此时这张表上还有操作正在进行,比如查询等,

那么只有等待这个查询操作完成,“drop table” 或”truncate table”或者增加字段的SQL才能获取这张表上的 “ACCESS EXCLUSIVE”锁,操作才能进行下去。

解决二:查询pg_locks是否有这个对象的锁

Section titled “解决二:查询pg_locks是否有这个对象的锁”

select oid,relname from pg_class where relname=‘table name’; select locktype,pid,relation,mode,granted,* from pg_locks where relation= ‘上面查询出来的oid’; select pg_terminate_backend(‘进程ID’);

问题解决!!!

坑:一开始不知道pg_cancel_backend(‘死锁那条数据的pid值’);##只能杀死select 语句, 对其他语句不生效,杀了进程查询发现还存在,反复杀反复存在,换了pg_terminate_backend(‘进程ID’)问题就解决了。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

原文链接:https://blog.csdn.net/fsstyle/article/details/87917720

ssh

  • SSH 隧道简明教程

    • 动态转发
      • 请求地址为192.168.1.100:3000,则通过 SSH 转发的请求地址也是192.168.1.100:3000。
      • ssh -N -D localhost:2000 root@192.168.10.85
      • 我们只需要在本地配置上 socks 代理,localhost:2000 即可把所有请求通过 ssh 2000 端口转发到 192.168.10.85 这台机器上去了。
    • 本地转发
      • 我们需要在 ServerA 上执行以下命令开启 ssh 隧道:
      • ssh -N -L 8888:192.168.10.134:8888 root@192.168.10.85
      • 执行后 serverA 上已经开始监听 8888 端口了,默认是在本地回环地址上,需要其他机器访问的话可以指定 ip 或者增加 -g 参数开启网关模式。
  • socks5 代理

  • 参考文章

  • 参考文章1

  • 参考文章2

    • 可以使用一个叫做Sockscap的软件,把应用扔进去就能以代理的方式上网了。(部分需要调用多个进程的应用可能不行)
    • 如果你想把socks代理转换成http代理,可以用privoxy这个东东。
~/.ssh/config
# 上传密钥~/.ssh/id_ed25519_iu
chmod 400 ~/.ssh/id_ed25519_iu
Host mac.intranet.company
HostName 10.0.1.251
User iuin
IdentityFile ~/.ssh/id_ed25519_iu
# PasswordAuthentication 123456
# ssh mac.intranet.company 看是否联通
终端窗口
# 登录服务器10.0.1.233
# 后台启动ssh动态转发
ssh -o GatewayPorts=yes -D 2000 mac.intranet.company -NTfCg
# 在本机中配置socks代理, 网络流量则会通过ssh转发到服务器上, 然后在访问互联网
# 配置地址: 10.0.1.233:2000
# PS: 可以配合clash一起使用, 实现通过ssh让中间机器去连接指定或多个VPN, 本机不连多余的VPN(其实是不想下载一堆的VPN相关软件), 只用clash就能透传流量过去
port: 7890
socks-port: 7891
allow-lan: false
mode: Rule
log-level: info
external-controller: 127.0.0.1:9090
proxies:
- name: iuin_bpDev_mac
type: socks5
server: 10.0.1.233
port: 2000
proxy-groups:
- name: ssh_g
type: select
proxies:
- iuin_bpDev_mac
rules:
# 乐橘nacos所在服务器
- IP-CIDR,10.0.10.180/32,ssh_g
- DOMAIN-SUFFIX,yelomall.cn,ssh_g

docker-compose服务间依赖通过自定义健康检查实现顺序启动

Docker Compose中的condition: service_healthy配置是用来判断依赖的服务是否健康的。当一个服务依赖于另一个服务时,可以使用depends_on和condition: service_healthy来确保依赖的服务已经健康启动。

下面是关于如何判断服务是否健康的一些相关内容:

  1. 健康检查命令:在Dockerfile或docker container run命令中,可以使用HEALTHCHECK来定义容器的健康检查命令[1]。健康检查命令可以是任何能够返回0或非0退出代码的命令,例如使用curl命令检查服务是否可访问。

  2. 健康检查参数:健康检查命令可以使用一些参数来配置检查的间隔、超时和重试次数等。常用的健康检查参数包括:

    • --interval:指定检查的间隔时间,默认为30秒。
    • --timeout:指定每次检查的超时时间,默认为30秒。
    • --retries:指定连续失败的次数后将服务标记为不健康,默认为3次。
    • --start-period:指定容器启动后等待健康检查开始的时间,默认为0秒。
  3. condition: service_healthy配置:在Docker Compose中,可以使用condition: service_healthy来指定依赖的服务是否健康。当依赖的服务的健康状态为健康时,才会启动当前的服务。这样可以确保依赖的服务已经成功启动并且可用。

下面是一个示例的docker-compose.yml文件,演示了如何使用健康检查和condition: service_healthy来判断服务是否健康并依次启动:

version: "3.8"
services:
flask:
build:
context: ./flask
dockerfile: Dockerfile
image: flask-demo:latest
environment:
- REDIS_HOST=redis-server
- REDIS_PASS=${REDIS_PASSWORD}
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:5000"]
interval: 30s
timeout: 3s
retries: 3
start_period: 40s
depends_on:
redis-server:
condition: service_healthy
networks:
- backend
- frontend
redis-server:
image: redis

在上述示例中,flask服务依赖于redis-server服务。flask服务的健康检查命令是使用curl命令检查http://localhost:5000是否可访问。只有当redis-server服务的健康状态为健康时,flask服务才会启动。


Learn more:

  1. 【Docker系列】Docker Compose 服务依赖和健康检查_docker-compose healthcheck-CSDN博客
  2. [docker]-docker-compose通过healthcheck判断容器状态并依次启动_docker-compose healthcheck-CSDN博客
  3. Docker compose 服务依赖关系及健康检查 - 掘金