BYPASS SHELL BY ./RAZORGANZ
Server: nginx/1.20.1
System: Linux iZdzfnv9mwfppeZ 5.10.134-19.2.al8.x86_64 #1 SMP Wed Oct 29 22:47:09 CST 2025 x86_64
User: apache (48)
PHP: 8.2.30
Disabled: NONE
Upload Files
File: //usr/local/sysak/.sysak_components/tools/plugin_cache.pyc
�
�]ic@s{ddlZddlZddlZddlTddlZedd�edd�e�defd��Y���Z	dS(	i����N(t*tnametcachettaskProctmeminfotCachePlugincBseeZdZd�Zd�Zed�Zd�Zd�Zd
d�Z
d�Zd�Zd	�Z
RS(s#Cache 插件,用于扫描系统 Cache 的使用情况

    启用条件:
        - 参数带 -f

    输出:
    1. filecache: 文件 Cache 使用情况
        节点:
            [
                ["/tmp/test", {"cached": 1024, "size": 1024, "task": ["systemd(1)"]}],
                ...
            ]
        pod:
            {
                "container1": [
                    ["/tmp/test", {"cached": 1024, "size": 1024, "task": ["systemd(1)"]}],
                    ...
                ],
                "container2": [
                    ["/tmp/test", {"cached": 1024, "size": 1024, "task": ["systemd(1)"]}],
                    ...
                ]]
            }
    2. filecache_shm: 共享内存文件 Cache 使用情况
        节点:
            [
                ["/dev/shm/test", {"cached": 1024, "size": 1024, "task": ["systemd(1)"], "shmem_kind": "Shmem"}],
                ...
            ]
        Pod:
            {
                "container1": [
                    ["/dev/shm/test", {"cached": 1024, "size": 1024, "task": ["systemd(1)"], "shmem_kind": "Shmem"}],
                    ...
                ],
                "container2": [
                    ["/dev/shm/test", {"cached": 1024, "size": 1024, "task": ["systemd(1)"], "shmem_kind": "Shmem"}],
            }
    cCshg}||kr|SxK||D]?}||kr9q!n||d}|jdj||��q!W|S(NtNames{}({})(tappendtformat(tselft
filePidMapttaskInfotfilenametrestpidR((s8/usr/local/sysak/.sysak_components/tools/plugin_cache.pytget_cache_file_pid6scCs?t�}|jjdd�}id}}xF|j�D]8}tj|�}||7}|dkr8|||<q8q8Wt|j�dd�dt�}	g}
d}xz|	D]r\}}
|
j	i|d6t
|
�dd	6t
|
�dd
6|j|||�d6�|d7}||kr�Pq�q�Wi|
d
6}
|jd|
�|S(s<通过 mincore 系统调用来计算文件的缓存大小。ttopNiitkeycSs|d|dfS(Nii((tkv((s8/usr/local/sysak/.sysak_components/tools/plugin_cache.pyt<lambda>Lstreversetfileitcachedtsizettaskit	filecachethost(
tPluginCollectInfotparamstgettkeyst	mem_utilstcal_cache_sizetsortedtitemstTrueRtintRtstore(R	R
Rtcollect_infoRt
filecache_mapttotal_cacheRRtsorted_filecacheRtcounttktv((s8/usr/local/sysak/.sysak_components/tools/plugin_cache.pytget_file_cache_by_mincoreAs4	



c!s�d�����fd���fd�}t�}tjdd
�}|s�tjjtjjt��}tjj|d�}nd}t	t
jd�d���}|j�}	xx|	D]p}
|
j
�j�}t|�d	kr�q�n|dj
�d
 }t|dj
��}
|dkr�|
}Pq�q�WWd
QXtj��}}d}d}|d+krbd}n|d.krwd}n�r�|jd�jd�}|d|ddd|jd|g	}n!|d|ddd|jdg}t
j|dd�\}}}|dkrtd|��nt	|jd���}tj|j��}�s�|jd �}|jd!�}|jd"�}|jd#i�jd$i�d}||||�\}}|jd%i|d&6|d'6�|S|jd#i�j|i�}x�|D]�}i}i}|jd(d�}|jd �}|j|�rs|j|�jd!i�}|j|�jd"i�}n||||�\}} |j|i|d&6| d'6�q�WWd
QX|SWd
QXd
S(/s<通过 podmem 工具扫描系统的文件 Cache 使用情况cSsL|jd�}|dkrH|jd|�}|dkrH||dSn|S(s�
            Pod 模式下,尝试还原容器的真实路径
            /ostree/deploy/LifseaOS/deploy/9401830260e19a6e0c84aad1f3ee493dc634ca208b669dff63159b41e366ce28.0/var/ostree/deploy/LifseaOS/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/29/fs/var/log/ntgh_data.log
                ↓
            /var/log/ntgh_data.log
            Args:
                item (_type_): _description_
            sE/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/i����s/fs/i(tfind(Rtoverly_indextfs_index((s8/usr/local/sysak/.sysak_components/tools/plugin_cache.pytextract_real_file_pathes		cs�|jdd�}�r'�|�}nt|jdd��}|jdd�j�}|dkr�i|d6|jdd�d6|jdd�d6�j|||�d	6|d6Si|d6|jdd�d6|jdd�d6�j|||�d	6SdS(
NRttshmemi����t
shmem_kindiRRR(RR$tstripR(titemR
RRR3R4(t
enable_podR1R	(s8/usr/local/sysak/.sysak_components/tools/plugin_cache.pytconvert_podmem_file_cache_itemws"c
s7g}g}d|kr�d|kr�|d}x'|D]}|j�|||��q5W|d}x�|D]}|j�|||��qiWn�d|kr-|d}x�t|�D]t\}	}t|jdd��}|	dkr�|j�|||��n|dkr�|j�|||��q�q�Wn||fS(Ntfilecache_filet
shmem_filet	sort_fileR3i����ii(Rt	enumerateR$R(
t
filecache_insR
RRt
filecache_shmRR6R3tsystem_file_cache_toptidx(R8(s8/usr/local/sysak/.sysak_components/tools/plugin_cache.pytget_one_file_cache�s,




tPODMEM_PATHtpodmemis
/proc/meminfotrii����itMemTotalNR2t100i it500i@t1000t	podDetecttpod_names-rs-tt30s-js-ps-sttimeouti�sFailed to run podmem %sRRR
tdatatsystemRRR>tcnamei�iIiiI(RtostgetenvtNonetpathtdirnametabspatht__file__tjointopenRt
get_real_patht	readlinesR5tsplittlenR$ttempfiletNamedTemporaryFiletget_collect_infotloadRtrun_cmdt	ExceptiontjsontloadstreadRR%texists(!R	tcontextR7RAR&tpodmem_patht
script_dirt	mem_totaltftlinestlineR"RRttmpfileRJt	scan_ratetcmdtcodetresultterrorRMttask_proc_collect_infoRR
tsystem_filecachet
filecache_restfilecache_shm_rest
pod_filecachetcons_filecacheROt
con_filecachetcons_filecache_shm((R8R7R1R	s8/usr/local/sysak/.sysak_components/tools/plugin_cache.pytget_file_cache_by_podmembs�	 	
			"
cCs)d}y�|jd�}|dkr(tS|r%|jd�jd�}|j|�sntjrjd|GHntS|j|�}|jdd�}|jdd�}|jd	d�}	|	dkr�tjr�d
|GHntSt	||�|	}
tjrd||||	|
d|dfGHn|
|kS|jd
�}|jd�}|jd�}|jd�}
|jd�}|
|}|dkr�tjr�dGHntS||}t	||�|}
tjr�d||||
d|dfGHn|
|kSWn2t
k
r$}tj|�tjr dGHntSXdS(sA判断是否需要扫描缓存,只有当 filecache + shmem 占用总使用内存的 30% 以上才扫描
        
        Args:
            context: 插件上下文
            enable_pod: 是否为 pod 模式
            
        Returns:
            bool: True 表示需要扫描,False 表示不需要扫描
        g333333�?RRIRJs1[Cache] Pod %s: no meminfo found, will scan cacheRiR3tusages([Cache] Pod %s: usage=0, skip cache scansL[Cache] Pod %s: cache=%s, shmem=%s, usage=%s, ratio=%.2f%%, threshold=%.2f%%idtCachedtBufferstShmemREtMemFrees)[Cache] Host: mem_used=0, skip cache scansW[Cache] Host: filecache=%sKB, shmem=%sKB, mem_used=%sKB, ratio=%.2f%%, threshold=%.2f%%s>[Cache] Error checking cache ratio, will scan cache by defaultN(R_RRR#R`RfRtis_debugRtFalsetfloatRbtlog_exception_in_debug_mode(R	RgR7tCACHE_THRESHOLDtmeminfo_collectRJtpod_meminfoRR3R}tcache_ratioRtbuffersRjtmem_freetmem_usedRte((s8/usr/local/sysak/.sysak_components/tools/plugin_cache.pytshould_scan_caches^
			

	
		
	cCs�|jjdt�}t�}|j||�sEtjrAdGHn|Sy|jd|d|�}Wnitk
r�}tj	|�|r�|S|j
d�}|jd�}|jd�}|j||�}nX|S(NR7s@[Cache] Cache ratio is below 30% threshold, skipping podmem scanRgRRR
(
RRR�RR�RR�R|RbR�R_R`R-(R	RgR7R
R�RtRR
((s8/usr/local/sysak/.sysak_components/tools/plugin_cache.pytcollectms"		
cCsod|}|r!d||}ndddg}g}dddg}d}	xB|D]:}
|j|
d	tj|
d
�dj|
d�g�qRW|	tj||||d
t�7}	d|}|r�d||}nddddg}ddddg}g}xI|D]A}
|j|
d	tj|
d
�|
ddj|
d�g�qW|	tj||||d
t�7}	|	S(Nu文件 Cache Top %su
容器 %s s	文件名s缓存大小s关联任务iPiR2RRt,Rtshowu共享内存文件 Cache Top %su	容器 %ss共享内存类型R4(RRtformat_unitRWtprint_tableR�(R	RR>RROttitletheadersRMtmax_col_lengthstres_strtvalue((s8/usr/local/sysak/.sysak_components/tools/plugin_cache.pytanalysis_one_table�s:

	

	c	Cs�t�}d|_d}xu|j�D]g\}}|jdg�}|jdg�}i|d6|d6|j|<||j||||�7}q%W||_|S(NtCacheR2RR>(tPluginAnalysisInfoR�R"RRrR�trender_text(	R	t
cache_infoRt
analysis_infoR�ROR�RR>((s8/usr/local/sysak/.sysak_components/tools/plugin_cache.pytanalysis_pod�s		 	cCsrt�}d|_|jdg�}|jdg�}|j|||�}||jd<||jd<||_|S(NR�RR>(R�R�RR�RrR�(R	R�RR�RR>R�((s8/usr/local/sysak/.sysak_components/tools/plugin_cache.pyt
analysis_host�s		

	cCs�|jjdd�}|jjdt�}|jd�}|rq|js^t�}d|_|S|j|j|�S|jd�}|dkr�t�}d|_|S|j
||�SdS(NRiR7RR�R(RRR�R_RMR�R�R�R`RRR�(R	RgRR7tcache_collect_infoR�t	host_data((s8/usr/local/sysak/.sysak_components/tools/plugin_cache.pytanalysis�s					N(t__name__t
__module__t__doc__RR-R�R|R�R�RRR�R�R�R�(((s8/usr/local/sysak/.sysak_components/tools/plugin_cache.pyR
s*		!�	W	+		(
RPRcR]t
plugin_systemRtplugintplugin_requirestplugin_pod_supportt
PluginBaseR(((s8/usr/local/sysak/.sysak_components/tools/plugin_cache.pyt<module>s