Friday, February 3, 2023
Thursday, January 12, 2023
[Linux] 使用 bash shell 監測某個 daemon 的執行緒數量
#!/bin/sh
# Define the process name
process_name=rsyslogd
# Get minimum number of threads from command line parameters
process_min_threads=$1
# Calculate number of threads for the given process name
num_threads=`ps -e -T -f | grep “${process_name}“ | grep -v “grep” | wc -l`
# Restart process when thread count is less than expected
if [ ${num_threads} -lt ${process_min_threads} ]; then
echo “Need to restart ${process_name} since current thread num ${num_threads} is less than ${process_min_threads}“
fi
From:
https://ephrain.net/linux-%E4%BD%BF%E7%94%A8-bash-shell-%E7%9B%A3%E6%B8%AC%E6%9F%90%E5%80%8B-daemon-%E7%9A%84%E5%9F%B7%E8%A1%8C%E7%B7%92%E6%95%B8%E9%87%8F/
[Linux] 最大執行緒數限制及當前執行緒數查詢
1、總結系統限制有:
/proc/sys/kernel/pid_max #查系統支援的最大執行緒數,一般會很大,相當於理論值
/proc/sys/kernel/thread-max
max_user_process(ulimit -u) #系統限制某使用者下最多可以執行多少程序或執行緒
/proc/sys/vm/max_map_count
硬體記憶體大小
2、Java虛擬機器本身限制:
-Xms #intial java heap size
-Xmx #maximum java heap size
-Xss #the stack size for each thread
3、查詢當前某程式的執行緒或程序數
pstree -p `ps -e | grep java | awk '{print $1}'` | wc -l
或
pstree -p 3660 | wc -l
4、查詢當前整個系統已用的執行緒或程序數
pstree -p | wc -l
1、 cat /proc/${pid}/status
2、pstree -p ${pid}
3、top -p ${pid} 再按H 或者直接輸入 top -bH -d 3 -p ${pid}
top -H
手冊中說:-H : Threads toggle
加上這個選項啟動top,top一行顯示一個執行緒。否則,它一行顯示一個程序。
4、ps xH
手冊中說:H Show threads as if they were processes
這樣可以檢視所有存在的執行緒。
5、ps -mp <PID>
手冊中說:m Show threads after processes
這樣可以檢視一個程序起的執行緒數。
[Linux] cpu 相關 command
判斷依據:
1.具有相同core id的cpu是同一個core的超執行緒。
2.具有相同physical id的cpu是同一顆cpu封裝的執行緒或者cores。
#邏輯CPU個數
cat /proc/cpuinfo | grep "processor" | wc -l
echo "physical CPU number:"
#物理CPU個數:
cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
echo "core number in a physical CPU:"
#每個物理CPU中Core的個數:
cat /proc/cpuinfo | grep "cpu cores" | uniq | awk -F: '{print $2}'
#查看每個physical cpu上core id的數量,即為每個物理CPU上的core的個數
cat /proc/cpuinfo | grep "core id"
#是否為超執行緒?
#如果有兩個邏輯CPU core具有相同的”core id”,那麼超執行緒是打開的。
# 當然也可知直接查詢 /proc/cpuinfo 中的 "ht"這個flag
cat /proc/cpuinfo | grep flags | grep ht
#每個物理CPU中邏輯CPU(可能是core, threads或both)的個數:
cat /proc/cpuinfo | grep "siblings"
Linux Index
Computer Science from the Bottom Up
CPU上下文切換的次數和時間 (context switch)
Linux-Command Online Explain
What does the dot at the end of the permissions in the output of "ls -lah" mean?
ubuntu/debian 大部分都不啟用 selinux ,所以都沒有;但 redhat/centos 預設有啟用 selinux,就會有
Tuesday, December 27, 2022
[Protocol] Avahi
Avahi 是一套使應用程式能夠公布或發現區域網上運行的服務和主機的系統
Avahi 啟動時,需要依賴 D-Bus
目的:找尋區域網路服務或設備
先了解知識:mDNS (Multicast DNS) 和 DNS-SD (DNS-based Service Discovery)
mDNS 就是對區網做「廣播」而廣播的內容則是我們熟悉的 DNS Query
DNS-SD -- 參考網頁中的「根據 DNS-SD 篩選出 Airplay / Chromecast 裝置」
Zeroconf 全稱為 Zero configuration networking,中文名則為零配置網路服務規範,是一種用於自動生成可用IP地址的網路技術,不需要額外的手動配置和專屬的配置伺服器。
精神在於希望把網路設定這件事情自動化,達到零設定(無須手動設定)的目的
主要是定義了三個層次
1. 指派位址(Address Selection)- 不需利用 dhcp server 取得 裝置地址如 IP 的相關資料
RFC 3927 , Dynamic Configuration of IPv4 Link-Local Addresses
2. 名稱解析(Name Resolution) - 不需要通過 DNS server 就轉換 domain name 和 IP 的關係
3. 服務搜尋(Service Discovery)- 利用 DNS-SD 來取得裝置服務,而不需通過 directory server
DNS-based Service Discovery, or DNS-SD.
- DNS-SD 的 FQDN 結構
- DNS-SD 會使用的 Record
Apple 的 zeroconf 協議技術實現 – Bonjour
apple 的 airplay,airprint 都是依賴了zeroconf 的基礎上,才展現出強大的功能
例子說明:
使用者擁有一臺apple tv和一臺iPhone4s,那之只要都連入到同一個無線區域網內,iphone4s就會自動找出apple tv,那麼在播放音樂或者視訊時候,使用者只要點選推送,就可以講音樂和視訊推送到apple tv上播放。
開源的 zeroconf 協議技術實現 – Avahi
Avahi 是 Zeroconf 規範的開源實現,可以分成 server 以及 client
server 的部份主要是要告訴大家你自己是誰, 提供區網有什麼服務
client 的部份主要是用來聽廣播, 取得區網上所有可使用的服務
環境
version: avahi-daemon (0.8-5ubuntu5)
johnnysu@johnnysu-VirtualBox:/etc/avahi/services$ ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.50.114 netmask 255.255.255.0 broadcast 192.168.50.255
inet6 fe80::49b2:8ba6:6532:9d0e prefixlen 64 scopeid 0x20<link>
ether 08:00:27:75:08:d1 txqueuelen 1000 (Ethernet)
RX packets 172828 bytes 65464536 (65.4 MB)
RX errors 21 dropped 0 overruns 0 frame 0
TX packets 17493 bytes 1902108 (1.9 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
device interrupt 19 base 0xd020
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 9106 bytes 919852 (919.8 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 9106 bytes 919852 (919.8 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ubuntu 安裝 avahi
avahi-utils - Avahi browsing, publishing and discovery utilities
sudo apt-get install avahi-daemon avahi-utils
查詢是否啟動
johnnysu@johnnysu-VirtualBox:~$ systemctl list-units --all | grep -E "dbus|avahi-daemon"
avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack
dbus.service loaded active running D-Bus System Message Bus
getty-static.service loaded inactive dead getty on tty2-tty6 if dbus and logind are not available
avahi-daemon.socket loaded active running Avahi mDNS/DNS-SD Stack Activation Socket
dbus.socket loaded active running D-Bus System Message Bus Socket
查詢監聽
johnnysu@johnnysu-VirtualBox:~/airplay$ sudo netstat -tlunp | grep avahi
udp 0 0 0.0.0.0:5353 0.0.0.0:* 5357/avahi-daemon:
udp 0 0 0.0.0.0:49226 0.0.0.0:* 5357/avahi-daemon:
udp6 0 0 :::5353 :::* 5357/avahi-daemon:
udp6 0 0 :::52810 :::* 5357/avahi-daemon:
設定檔
/etc/avahi/avahi-daemon.conf
[server]
host-name=johnny
domain-name=local
如果有設定 ipv6=no 的話,
use-ipv6=no
以下就會沒有
udp6 0 0 :::5353 :::* 5357/avahi-daemon:
udp6 0 0 :::52810 :::* 5357/avahi-daemon:
重新啟動
sudo systemctl restart avahi-daemon
找另一台主機確定 mDNS server 是否通
wolfe@wolfe-VirtualBox:~/work/UxPlay-master$ ping johnny.local
PING johnny.local (192.168.50.114) 56(84) bytes of data.
64 bytes from 192.168.50.114 (192.168.50.114): icmp_seq=1 ttl=64 time=27.8 ms
64 bytes from 192.168.50.114 (192.168.50.114): icmp_seq=2 ttl=64 time=18.1 ms
64 bytes from 192.168.50.114 (192.168.50.114): icmp_seq=3 ttl=64 time=2.33 ms
register an mDNS/DNS-SD service 有 2 種方式
1. 透過 avahi-publish 方式 register an mDNS/DNS-SD service
avahi-publish -s [options] name service-type port [TXT data ...]
avahi-publish-service [options] name service-type port [TXT data ...]avahi-publish -s "My service" _myservic._tcp 1234
johnnysu@johnnysu-VirtualBox:/etc/avahi/services$ avahi-browse -a -r
= enp0s3 IPv4 My service _myservic._tcp local
hostname = [johnny.local]
address = [192.168.50.114]
port = [1234]
txt = []
2. 編寫你自己的服務 (提供 DNS-SD 會使用的 Record)
預設是放在 /etc/avahi/services
johnnysu@johnnysu-VirtualBox:/etc/avahi/services$ ls
ftp.service smb.service
ftp.service
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">FTP</name>
<service>
<type>_ftp._tcp</type>
<host-name>ftp.johnny.local</host-name>
<port>21</port>
<txt-record>path=/share</txt-record>
<txt-record>u=guest</txt-record>
<txt-record>p=pass</txt-record>
</service>
</service-group>
smb.service
<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
<name replace-wildcards="yes">Samba</name>
<service>
<type>_smb._tcp</type>
<host-name>smb.johnny.local</host-name>
<port>445</port>
<txt-record>path=/share</txt-record>
<txt-record>u=guest</txt-record>
<txt-record>p=pass</txt-record>
</service>
</service-group>
在 /usr/share/doc/avahi-daemon/examples 裡有一些現成的範例
其它細節可以參考這裡 http://manpages.ubuntu.com/manpages/precise/man5/avahi.service.5.html
Service type 定義在 avahi/service-type-database/service-types 根據 DNS SRV (RFC 2782) Service Types
_ftp._tcp:FTP File Transfer
_airplay._tcp:AirPlay Remote Video
Finished register an mDNS/DNS-SD service,設定 host name/address mapping
avahi 預設會為 hosts 的 IP 去反查域名,所以不能多個 domain name 指向同 1 個 IP
設定 host name 對映 address (擇一)
way1
sudo vim /etc/avahi/hosts
192.168.50.114 ftp.johnny.local
way2 (一定要有 .local)
/usr/local/bin/avahi-add-names.sh
/usr/bin/avahi-publish -a -R ftp.johnny.local 192.168.50.114 > /dev/null 2>&1 &
/usr/bin/avahi-publish -a -R smb.johnny.local 192.168.50.115 > /dev/null 2>&1 &
chmod +x /usr/local/bin/avahi-add-names.sh
sed -i '/ExecStart/aExecStartPost=\/usr\/local\/bin\/avahi-add-names\.sh' /lib/systemd/system/avahi-daemon.service
sudo systemctl daemon-reload
啟動,擇一
1. sudo /etc/init.d/avahi-daemon start
2. sudo systemctl start avahi-daemon
查看狀況
johnnysu@johnnysu-VirtualBox:~/airplay/test-avahi$ sudo systemctl status avahi-daemon
● avahi-daemon.service - Avahi mDNS/DNS-SD Stack
Loaded: loaded (/lib/systemd/system/avahi-daemon.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2022-12-27 17:01:49 CST; 2s ago
TriggeredBy: ● avahi-daemon.socket
Process: 6718 ExecStartPost=/usr/local/bin/avahi-add-names.sh (code=exited, status=0/SUCCESS)
Main PID: 6716 (avahi-daemon)
Status: "avahi-daemon 0.8 starting up."
Tasks: 4 (limit: 4626)
Memory: 1.6M
CPU: 23ms
CGroup: /system.slice/avahi-daemon.service
├─6716 "avahi-daemon: running [johnnysu-VirtualBox.local]"
├─6717 "avahi-daemon: chroot helper"
├─6719 /usr/bin/avahi-publish -a -R ftp.johnny.local 192.168.50.114
└─6720 /usr/bin/avahi-publish -a -R smb.johnny.local 192.168.50.115
十二 27 17:01:49 johnnysu-VirtualBox avahi-daemon[6716]: Network interface enumeration completed.
十二 27 17:01:49 johnnysu-VirtualBox avahi-daemon[6716]: Registering new address record for fe80::49b2:8ba6:6532:9d0e on enp0s3.*.
十二 27 17:01:49 johnnysu-VirtualBox avahi-daemon[6716]: Registering new address record for 192.168.50.114 on enp0s3.IPv4.
十二 27 17:01:49 johnnysu-VirtualBox avahi-daemon[6716]: Registering new address record for ::1 on lo.*.
十二 27 17:01:49 johnnysu-VirtualBox avahi-daemon[6716]: Registering new address record for 127.0.0.1 on lo.IPv4.
十二 27 17:01:49 johnnysu-VirtualBox systemd[1]: Started Avahi mDNS/DNS-SD Stack.
十二 27 17:01:49 johnnysu-VirtualBox avahi-daemon[6716]: Server startup complete. Host name is johnnysu-VirtualBox.local. Local service cookie is 2433229662.
十二 27 17:01:50 johnnysu-VirtualBox avahi-daemon[6716]: Service "FTP" (/services/ftp.service) successfully established.
十二 27 17:01:50 johnnysu-VirtualBox avahi-add-names.sh[6720]: Established under name 'smb.johnny.local'
十二 27 17:01:50 johnnysu-VirtualBox avahi-add-names.sh[6719]: Established under name 'ftp.johnny.local'
立即測試的話,可用:nohup ./avahi-add-names.sh
以下用 client 來測試
使用 avahi-browse 測試
wolfe@wolfe-VirtualBox:~/work/UxPlay-master$ avahi-browse -r -t _ftp._tcp
+ enp0s3 IPv4 FTP FTP File Transfer local
= enp0s3 IPv4 FTP FTP File Transfer local
hostname = [ftp.johnny.local]
address = [192.168.50.114]
port = [21]
txt = ["p=pass" "u=guest" "path=/share"]
FTP File Transfer local= enp0s3 IPv4 FTP
FTP File Transfer local
hostname = [ftp.johnny.local]
address = [192.168.50.114]
port = [21]
txt = ["p=pass" "u=guest" "path=/share"]
Johnnysu@johnnysu-VirtualBox:~$ avahi-browse -r -t _smb._tcp
+ enp0s3 IPv4 JOHNNYSU-VIRTUALBOX Microsoft Windows Network local
+ lo IPv4 JOHNNYSU-VIRTUALBOX Microsoft Windows Network local
= enp0s3 IPv4 JOHNNYSU-VIRTUALBOX Microsoft Windows Network local
hostname = [johnny.local]
address = [192.168.50.114]
port = [445]
txt = []
= lo IPv4 JOHNNYSU-VIRTUALBOX Microsoft Windows Network local
hostname = [johnny.local]
address = [127.0.0.1]
port = [445]
txt = []
其它指令:
##發現所有已註冊的服務
avahi-browse -a -r
使用 dig 測試服務是否活著
成功
johnnysu@johnnysu-VirtualBox:/etc/avahi/services$ dig -p 5353 @192.168.50.114 ftp.johnny.local
; <<>> DiG 9.18.1-1ubuntu1.1-Ubuntu <<>> -p 5353 @192.168.50.114 ftp.johnny.local
; (1 server found)
;; global options: +cmd
;; Got answer:
;; WARNING: .local is reserved for Multicast DNS
;; You are currently testing what happens when an mDNS query is leaked to DNS
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34416
;; flags: qr aa; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;ftp.johnny.local. IN A
;; ANSWER SECTION:
ftp.johnny.local. 10 IN A 192.168.50.114
;; Query time: 0 msec
;; SERVER: 192.168.50.114#5353(192.168.50.114) (UDP)
;; WHEN: Tue Dec 27 17:24:30 CST 2022
;; MSG SIZE rcvd: 50
因為沒有 192.168.50.115 server,所以沒找到
johnnysu@johnnysu-VirtualBox:/etc/avahi/services$ dig -p 5353 @192.168.50.115 _smb._tcp.local ptr
; <<>> DiG 9.18.1-1ubuntu1.1-Ubuntu <<>> -p 5353 @192.168.50.115 _smb._tcp.local ptr
; (1 server found)
;; global options: +cmd
;; connection timed out; no servers could be reached
使用 nmap 測試
johnnysu@johnnysu-VirtualBox:~$ sudo nmap -Pn -sUC -p5353 192.168.50.114
Starting Nmap 7.80 ( https://nmap.org ) at 2022-12-28 10:03 CST
Nmap scan report for johnnysu-VirtualBox (192.168.50.114)
Host is up (0.000072s latency).
PORT STATE SERVICE
5353/udp open zeroconf
| dns-service-discovery:
| 21/tcp ftp
| Address=192.168.50.114
| 445/tcp smb
| Address=192.168.50.114 fe80::49b2:8ba6:6532:9d0e
| Device Information
|_ Address=192.168.50.114 fe80::49b2:8ba6:6532:9d0e
Monday, December 26, 2022
[Protocol] D-Bus introduction
D-Bus,數據總線,是一個低延遲,低開銷,高可用性的 IPC 機制,协议传递的是二进制数据,, 而不是其他的文本格式 (如JSON/XML), 协议是基于消息处理的, 而不是基于流
相较于传统意义上的 IPC 机制(例如PIPE/FIFO/Socket/共享内存/SysvIpc),D-Bus提供了更高层次的抽象
目前也透過 kobject 與 kernel 做整合,如此一來,D-BUS 便能輕易整合 kernel、application 與 desktop,真正解決以往「系統整合」所遇到的障礙。
http://dbus.freedesktop.org/doc/dbus-glib/index.html
1. 方法调用(Method Call):用来实现跨进程的方法(函数)调用,配合代码生成工具,可以做到让进程间的函数调用和普通的函数调用几无区别
2. 信号(Signal):发布订阅(Pub-Sub)模式的通信机制,发送进程注册并发送(广播)信号,接收进程订阅自己感兴趣的信号。
3. 属性(Property):可类比 C++ 类中成员变量的 Getter-Setter,如果进程A提供了一个属性,那么其他进程可以通过D-Bus来读取、写入该属性。
在架構上分位三層
1. Layer 1 libdbus :freedesktop 機構提供的一個免費開源的一個由C語言編寫的 low-level API 。是提供dbus功能的庫。是高階API繫結的低階API
2. Layer 2 dbus daemon :dbus實現的IPC守護進行,隨Linux啟動,通過不通程序對其的連線,實現了多程序間訊息的路由(包含核心、網路、桌面等)
3. Layer 3 Wapper libraries (high-level API): 對 low-level API libdbus 的封裝 ,例如 libdbus-qt libdbus-python github.com/godbus/dbus ,這些不同程式語言實現的 Wapper 是不同開發者應該使用的lib,其簡化了D-Bus的開發難度。最基础的是 C,有官方提供的参考代码,也有 Java、Python等,每种语言的实现被称为 D-Bus Binding。
n8n index
【n8n免費本地端部署】Windows版|程式安裝x指令大補帖 【一鍵安裝 n8n】圖文教學,獲得無限額度自動化工具&限時免費升級企業版功能
-
模板直到实例化时才生成代码,所以获得模板代码编译错误的时机较晚。编译器在3个阶段报告错误: 1. 第一阶段是编译模板本身时,此时一般错误很少,只是 检查语法错误 ,不检查依赖于类型的代码 第二个阶段是遇到使用模板时,对函数模板调用编译器会 检查实参数目是否正确 。还要检查 参数类...
-
编译器遇到一个模板定义时,并不生成代码。只有当实例化模板时编译器才生成代码。 当调用一个函数时, 编译器只需要掌握函数的声明,函数定义不必已经出现 ,即使不定义,编译也会通过, 最终会在链接时才发现undefined symbol这个熟悉的错误 。 但对于模板来说却不同,生成一...
-
iostream 标准库,它提供了 cin 和 cout 方法分别用于 从标准输入读取流和向标准输出写入流 。 如何从 文件读取流和向文件写入流 。这就需要用到 C++ 中另一个标准库 fstream,它定义了三个新的数据类型: 数据类型 描述 ofstream 该数据类型表...