aspeed2600 openbmc对mctp over pcie的支持分析(支持mctp over pcie)

2024-08-29 13:44

本文主要是介绍aspeed2600 openbmc对mctp over pcie的支持分析(支持mctp over pcie),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

遍搜全网,竟然关于openbmc mctp over pcie的支持说明情况了无文章,这不是一个艰难的问题,服务器BMC也不是一个超级精尖的产品,想当年分享stm32资料,都是满天飞。可能服务器市场大家对于文章上的分享并无兴趣。

此篇文章只是一个最基本的简单的说明文章,弥补一下openbmc资源匮乏吧。另外,本片文章只是一个简单的开篇文章,有错漏,有知识不全面,请尽管评论。

注意: 本章涉及的代码可以查看代码仓库:https://gitee.com/wit_yuan/yuan_mctpd/tree/yuan_modified_mctpd

1.官方活跃的mctp支持情况

官方活跃的2个仓库有:https://github.com/CodeConstruct/mctp和https://github.com/openbmc/libmctp,这一套下来还需要kernel的支持, 代码的提交可以参考如下链接:
https://lore.kernel.org/netdev/20210729022053.134453-1-jk@codeconstruct.com.au/
简单来讲,可以参考内核这几个文件:

build/ast2600-default/workspace/sources/linux-aspeed/net/mctp/af_mctp.c
build/ast2600-default/workspace/sources/linux-aspeed/net/mctp/device.c
build/ast2600-default/workspace/sources/linux-aspeed/net/mctp/neigh.c
build/ast2600-default/workspace/sources/linux-aspeed/net/mctp/route.c
build/ast2600-default/workspace/sources/linux-aspeed/net/socket.c

这几个文件是核心的整个mctp架构代码。

如下几个文件是驱动代码,对接到硬件上:

build/ast2600-default/workspace/sources/linux-aspeed/drivers/net/mctp/mctp-i2c.c
build/ast2600-default/workspace/sources/linux-aspeed/drivers/net/mctp/mctp-i3c.c
build/ast2600-default/workspace/sources/linux-aspeed/drivers/net/mctp/mctp-serial.c

可以看到,这里面没有一个直接的针对mctp-pcie.c文件,粗浅看,这个架构是不支持mctp over pcie的。

补充一点,文件:build/ast2600-default/workspace/sources/linux-aspeed/drivers/soc/aspeed/aspeed-mctp.c是内核的mctp over pcie驱动文件,但是说了与不说一样,因为架构上没支持(差一个驱动程序)。

简单看一下文件:build/ast2600-default/workspace/sources/linux-aspeed/drivers/net/mctp/mctp-i2c.c中的mctp_i2c_add_netdev()函数:

static int mctp_i2c_add_netdev(struct mctp_i2c_client *mcli,struct i2c_adapter *adap)
---> struct net_device *ndev = NULL;
---> ndev = alloc_netdev(sizeof(*midev), namebuf, NET_NAME_ENUM, mctp_i2c_net_setup);
---> rc = mctp_register_netdev(ndev, &mctp_i2c_mctp_ops);

可以反推,目前的架构是不支持mctp over pcie的。当前的架构情况是kernel mctp + lib + dbus服务组成。

2.intel-mctp的支持情况

留意: intel已经对这一块不再维护了。

可以在intelopenbmc仓库里面,找到链接:

  • 1.libmctp链接:https://github.com/Intel-BMC/libmctp
  • 2.pmci链接:https://github.com/Intel-BMC/pmci
  • 3.mctpd链接:https://github.com/Intel-BMC/pmci/tree/master/mctpd

mctpd仓库代码,基本上看到是支持mctp over pcie的并且BMC是支持作为endpoint的。这符合我的需求。

我的需求如下:

1.bios作为bus owner,负责分配eid
2.bmc作为endpoint,访问其他pcie设备

2.1 libmctp分析

libmctp的代码仓库如下:
https://github.com/Intel-BMC/libmctp

对于mctp over pcie的支持,可查看文件:

build/ast2600-default/workspace/sources/libmctp-intel/libmctp.h
build/ast2600-default/workspace/sources/libmctp-intel/astpcie.c

库的功能实现用的是.c文件,实现基本的ioctl(),对于C++来说不好和kernel交互的代码。这里是实现就没什么可说的。

2.2.intel-bmcmctpd的实现

mctpd的代码仓库如下:
https://github.com/Intel-BMC/pmci/tree/master/mctpd

这一块的作用是作为一个dbus service,供其他client调用接口。代码结构比较清晰。

注意,这里面有一个yaml的文件需要导入,作为serverclient等的支持的头文件。

文件可以参考一个patch: https://github.com/Intel-BMC/openbmc/blob/ac27a5095790a2d49a44d7c46440e375a8f84812/meta-openbmc-mods/meta-common/recipes-phosphor/dbus/phosphor-dbus-interfaces/0032-update-meson-build-for-MCTP-interfaces.patch#L33,具体需要修改:
在这里插入图片描述
与:
在这里插入图片描述

2.3 导入intel bmc mctp over pcie的实现

注意:这里导入只是一个基本的功能测试mctp over pcie,不是实际功能开发。

参考git仓库上的.bb文件,资源路径:
https://github.com/Intel-BMC/openbmc/tree/1-release/meta-openbmc-mods/meta-common/recipes-phosphor/pmci.

在目录: meta-aspeed-sdk/recipes-phosphor/mctpd/中导入https://github.com/Intel-BMC/openbmc/blob/1-release/meta-openbmc-mods/meta-common/recipes-phosphor/pmci/mctpd.bb文件。

修改mctpd.bb文件名,改为:mctpd_1.0.bb,内容如:

SUMMARY = "MCTP Daemon"
DESCRIPTION = "Implementation of MCTP (DTMF DSP0236)"LICENSE = "CLOSED"
SRC_URI = "file://mctpd.tar.gz"S = "${WORKDIR}"
PV = "1.0+git${SRCPV}"OECMAKE_SOURCEPATH = "${S}"inherit cmake systemdFILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"DEPENDS += " \libmctp-intel \systemd \sdbusplus \phosphor-logging \boost \i2c-tools \cli11 \nlohmann-json \gtest \phosphor-dbus-interfaces \udev \"PACKAGECONFIG[systemd] = ",,systemd,libsystemd"
SYSTEMD_AUTO_ENABLE:${PN} = "enable"do_install:append(){install -d ${D}/${systemd_system_unitdir}install -d ${D}/${bindir}install -d ${D}/${datadir}/mctp/install -m 755 ${WORKDIR}/${PN}-${PV}/mctpd ${D}/${bindir}install -m 0644 ${S}/configurations/mctp_config.json ${D}/${datadir}/mctp/mctp_config.jsoninstall -m 0644 ${S}/service_files/xyz.openbmc_project.mctpd@.service \${D}/${systemd_system_unitdir}/xyz.openbmc_project.mctpd@.service
}FILES:${PN} += "${systemd_system_unitdir}"
FILES:${PN} += "${datadir}/mctp/"
FILES:${PN} += "${bindir}"

如上,是因为当前使用的openbmc代码未加入intel mctp.bb文件,故把mctpd的代码从intel-bmc网站上下载下来之后,打包成:mctpd.tar.gz,整个目录结构如下:

在这里插入图片描述
采取命令:

# devtool modify mctpd

之后,需要修改build/ast2600-default/tmp/work/armv7ahf-vfpv4d16-openbmc-linux-gnueabi/mctpd/1.0+git/CMakeLists.txt中的内容:

set(CMAKE_CXX_STANDARD 23)-Wnull-dereference \  //需要去掉
install(FILES ${SERVICE_FILES} DESTINATION /usr/lib/systemd/system/) //修改为/usr目录下

另外,修改文件build/ast2600-default/workspace/sources/mctpd/src/SMBusBinding.cpp,注释掉其中的内容:

void SMBusBinding::readResponse()
{// smbusReceiverFd.async_wait(//     boost::asio::posix::descriptor_base::wait_error, [this](auto& ec) {//         if (ec)//         {//             phosphor::logging::log<phosphor::logging::level::ERR>(//                 "Error: mctp_smbus_read()");//             readResponse();//         }//         // through libmctp this will invoke rxMessage and message assembly//         mctp_smbus_read(smbus);//         readResponse();//     });phosphor::logging::log<phosphor::logging::level::ERR>("mctpd yuan modify it, Error: SMBusBinding::readResponse()");
}

另外,修改文件:build/ast2600-default/workspace/sources/mctpd/include/hw/aspeed/PCIeMonitor.hpp中的:

    static constexpr const char* astUdevPath ="/sys/devices/platform/ahb/ahb:apb/1e6e8000.mctp/misc/aspeed-mctp0";

修改文件:meta-aspeed-sdk/recipes-aspeed/packagegroups/packagegroup-oss.bb中的内容:

# delete mctp , wityuan noted 2024/08/25.
SUMMARY:${PN}-apps = "Open Source Applications"
RDEPENDS:${PN}-apps = " \mdio-tool \gperf \iperf3 \pciutils \ethtool \mmc-utils \i3c-tools \i2c-tools \xdma-test \libpeci \dhrystone \nbd-client \iozone3 \ncsi-netlink \hdparm \stressapptest \e2fsprogs-mke2fs \nvme-cli \${@d.getVar('PREFERRED_PROVIDER_u-boot-fw-utils', True) or 'u-boot-fw-utils'} \aer-inject \fio \memtester \coremark \"

删掉了其中的mctp.

之后,执行如下命令,编译mctpd:

# bitbake -c build mctpd

2.4 导入intel-bmc libmctp pcie的实现

当前的openbmc代码实际上是包含libmctp-intel的实现的。修改libmctp-intelbb文件:
修改meta-aspeed-sdk/recipes-phosphor/pmci/libmctp-intel_git.bb文件,内容如:

SUMMARY = "libmctp:intel"
DESCRIPTION = "Implementation of MCTP(DMTF DSP0236)"SRC_URI = "git://github.com/Intel-BMC/libmctp.git;protocol=https;branch=master"
SRCREV = "21dc38e911a27af2e914f834b2e2b775f7dad520"S = "${WORKDIR}/git"PV = "1.0+git"LICENSE = "Apache-2.0 | GPL-2.0-or-later"
LIC_FILES_CHKSUM = "file://LICENSE;md5=0d30807bb7a4f16d36e96b78f9ed8fae"inherit cmake systemd
FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"DEPENDS += "i2c-tools"#FILES:${PN}-dev += ""
FILES:${PN} += " ${libdir}"LIBVER = "0.1.0"do_install:append() {install -d ${D}${libdir}install -m 755 ${WORKDIR}/${PN}-${PV}/libmctp_intel.so.${LIBVER} ${D}/${libdir}/
}

修改build/ast2600-default/workspace/sources/libmctp-intel/CMakeLists.txt文件,增加内容:

SET_TARGET_PROPERTIES(mctp_intel PROPERTIES VERSION 0.1.0 SOVERSION 0)

修改内容:

add_library (mctp_intel SHARED alloc.c asti3c.c astlpc.c core.c log.c libmctp.h serial.c astpcie.c smbus.c)

接着修改文件:build/ast2600-default/workspace/sources/libmctp-intel/astpcie.h中的内容:

/* driver device file */
#define AST_DRV_FILE "/dev/aspeed-mctp0"

注意,还需要修改文件:meta-aspeed-sdk/recipes-core/images/obmc-phosphor-image.bbappend:

IMAGE_INSTALL:append = " \webui-vue \libmctp \entity-manager \dbus-sensors \"

libmctp改为libmctp-intel.

执行编译操作:

# bitbake -c build libmctp-intel

编译成功后,启动BMC,或者在文件:build/ast2600-default/workspace/sources/libmctp-intel/oe-workdir/libmctp-intel-1.0+git中可以看到如下信息:

# ls /usr/lib/libm* -al
-rwxr-xr-x    1 root     root        271756 Mar  9  2018 /usr/lib/libm.so.6
lrwxrwxrwx    1 root     root            16 Mar  9  2018 /usr/lib/libmapper.so.1 -> libmapper.so.1.0
-rwxr-xr-x    1 root     root         13548 Mar  9  2018 /usr/lib/libmapper.so.1.0
lrwxrwxrwx    1 root     root            22 Mar  9  2018 /usr/lib/libmctp_intel.so.0 -> libmctp_intel.so.0.1.0
-rwxr-xr-x    1 root     root         34064 Mar  9  2018 /usr/lib/libmctp_intel.so.0.1.0
lrwxrwxrwx    1 root     root            15 Mar  9  2018 /usr/lib/libmnl.so.0 -> libmnl.so.0.2.0
-rwxr-xr-x    1 root     root         17748 Mar  9  2018 /usr/lib/libmnl.so.0.2.0
lrwxrwxrwx    1 root     root            17 Mar  9  2018 /usr/lib/libmount.so.1 -> libmount.so.1.1.0
-rwxr-xr-x    1 root     root        407264 Mar  9  2018 /usr/lib/libmount.so.1.1.0

在这里插入图片描述

注意:
BMC的驱动名称已经改变:

# ls /dev/aspeed-mctp0  -al
crw-------    1 root     root       10, 111 Sep 20 11:23 /dev/aspeed-mctp0

接着修改文件:build/ast2600-default/conf/local.conf,添加内容:

...
IMAGE_INSTALL:append = " mctpd"

以上,改完之后,编译生成镜像:

# bitbake obmc-phosphor-image

最终,启动BMC,在BMC串口下执行命令:

# /usr/bin/mctpd -b pcie &

然后检查是否成功启动dbus mctp服务。

  • 1.查看mctpd服务
# busctl | grep mctp
:1.71                                                  425 mctpd           root             :1.71         serial-getty@ttyS4.service                    -
xyz.openbmc_project.MCTP-pcie                          425 mctpd           root             :1.71         serial-getty@ttyS4.service 

在这里插入图片描述

  • 2.查看检查到哪些endpoint
# busctl tree xyz.openbmc_project.MCTP-pcie
`- /xyz`- /xyz/openbmc_project`- /xyz/openbmc_project/mctp`- /xyz/openbmc_project/mctp/device|- /xyz/openbmc_project/mctp/device/10|- /xyz/openbmc_project/mctp/device/29|- /xyz/openbmc_project/mctp/device/61`- /xyz/openbmc_project/mctp/device/8

在这里插入图片描述

  • 3.检查endpoint属性信息
# busctl introspect  xyz.openbmc_project.MCTP-pcie  /xyz/openbmc_project/mctp/device/10
NAME                                                 TYPE      SIGNATURE RESULT/VALUE                             FLAGS
org.freedesktop.DBus.Introspectable                  interface -         -                                        -
.Introspect                                          method    -         s                                        -
org.freedesktop.DBus.Peer                            interface -         -                                        -
.GetMachineId                                        method    -         s                                        -
.Ping                                                method    -         -                                        -
org.freedesktop.DBus.Properties                      interface -         -                                        -
.Get                                                 method    ss        v                                        -
.GetAll                                              method    s         a{sv}                                    -
.Set                                                 method    ssv       -                                        -
.PropertiesChanged                                   signal    sa{sv}as  -                                        -
xyz.openbmc_project.Common.UUID                      interface -         -                                        -
.UUID                                                property  s         "bca4af17-8995-5632-be7d-53f1697c7912"   emits-change
xyz.openbmc_project.Inventory.Decorator.LocationCode interface -         -                                        -
.LocationCode                                        property  s         ""                                       emits-change
xyz.openbmc_project.Inventory.Decorator.PCIDevice    interface -         -                                        -
.Bus                                                 property  y         57                                       emits-change
.Device                                              property  y         0                                        emits-change
.Function                                            property  y         0                                        emits-change
xyz.openbmc_project.MCTP.Endpoint                    interface -         -                                        -
.Mode                                                property  s         "xyz.openbmc_project.MCTP.Base.Bindin... emits-change
.NetworkId                                           property  q         0                                        emits-change
xyz.openbmc_project.MCTP.PCIVendorDefined            interface -         -                                        -
.MessageTypeProperty                                 property  aq        1 83                                     emits-change
.VendorID                                            property  s         "0x590"                                  emits-change
xyz.openbmc_project.MCTP.SupportedMessageTypes       interface -         -                                        -
.Ethernet                                            property  b         false                                    emits-change
.MctpControl                                         property  b         true                                     emits-change
.NCSI                                                property  b         false                                    emits-change
.NVMeMgmtMsg                                         property  b         false                                    emits-change
.PLDM                                                property  b         true                                     emits-change
.SPDM                                                property  b         false                                    emits-change
.VDIANA                                              property  b         false                                    emits-change
.VDPCI                                               property  b         true                                     emits-change
root@ast2600-default:~#

在这里插入图片描述

  • 4.检查另外一个endpoint:
# busctl introspect  xyz.openbmc_project.MCTP-pcie  /xyz/openbmc_project/mctp/device/8
NAME                                                 TYPE      SIGNATURE RESULT/VALUE                             FLAGS
org.freedesktop.DBus.Introspectable                  interface -         -                                        -
.Introspect                                          method    -         s                                        -
org.freedesktop.DBus.Peer                            interface -         -                                        -
.GetMachineId                                        method    -         s                                        -
.Ping                                                method    -         -                                        -
org.freedesktop.DBus.Properties                      interface -         -                                        -
.Get                                                 method    ss        v                                        -
.GetAll                                              method    s         a{sv}                                    -
.Set                                                 method    ssv       -                                        -
.PropertiesChanged                                   signal    sa{sv}as  -                                        -
xyz.openbmc_project.Common.UUID                      interface -         -                                        -
.UUID                                                property  s         "00000000-0000-0000-0000-000000000000"   emits-change
xyz.openbmc_project.Inventory.Decorator.LocationCode interface -         -                                        -
.LocationCode                                        property  s         ""                                       emits-change
xyz.openbmc_project.Inventory.Decorator.PCIDevice    interface -         -                                        -
.Bus                                                 property  y         0                                        emits-change
.Device                                              property  y         20                                       emits-change
.Function                                            property  y         6                                        emits-change
xyz.openbmc_project.MCTP.Endpoint                    interface -         -                                        -
.Mode                                                property  s         "xyz.openbmc_project.MCTP.Base.Bindin... emits-change
.NetworkId                                           property  q         0                                        emits-change
xyz.openbmc_project.MCTP.PCIVendorDefined            interface -         -                                        -
.MessageTypeProperty                                 property  aq        1 256                                    emits-change
.VendorID                                            property  s         "0x8086"                                 emits-change
xyz.openbmc_project.MCTP.SupportedMessageTypes       interface -         -                                        -
.Ethernet                                            property  b         false                                    emits-change
.MctpControl                                         property  b         true                                     emits-change
.NCSI                                                property  b         false                                    emits-change
.NVMeMgmtMsg                                         property  b         false                                    emits-change
.PLDM                                                property  b         false                                    emits-change
.SPDM                                                property  b         false                                    emits-change
.VDIANA                                              property  b         false                                    emits-change
.VDPCI                                               property  b         true                                     emits-change

如此,基本的mctp over pcie代码逻辑基本上跑通了。

3.问题与解决

3.1 报错libmctp-intel rdepends on libmctp-intel-dev

出现报错信息如下:

ERROR: libmctp-intel-1.0+git-r0 do_package_qa: QA Issue: libmctp-intel rdepends on libmctp-intel-dev [dev-deps]
ERROR: libmctp-intel-1.0+git-r0 do_package_qa: QA Issue: -dev package libmctp-intel-dev contains non-symlink .so '/usr/lib/libmctp_intel.so' [dev-elf]

针对此问题,解决办法如:
CmakeFile中添加:

SET_TARGET_PROPERTIES(mctp_intel PROPERTIES VERSION 0.1.0 SOVERSION 0)

这样可以生成:

lrwxrwxrwx  1 wityuan wityuan     18 826 23:19 libmctp_intel.so -> libmctp_intel.so.0
lrwxrwxrwx  1 wityuan wityuan     22 826 23:19 libmctp_intel.so.0 -> libmctp_intel.so.0.1.0
-rwxr-xr-x  1 wityuan wityuan 150972 826 23:19 libmctp_intel.so.0.1.0

然后: .bb 中添加:

do_install:append() {install -d ${D}${libdir}install -m 755 ${WORKDIR}/${PN}-${PV}/libmctp_intel.so.${LIBVER} ${D}/${libdir}/
}

或者使用静态库?!!, 暂时改为动态库了。

3.2 报错Pseudo log: path mismatch

报错信息如下:

ERROR: Task (/home/wityuan/Desktop/sdk_v09.01/openbmc/meta-aspeed-sdk/recipes-phosphor/mctpd/mctpd_1.0.bb:do_install) failed with exit code '1' 
Pseudo log:
path mismatch [3 links]: ino 21059040 db '/home/wityuan/Desktop/sdk_v09.01/openbmc/build/ast2600-default/tmp/work/armv7ahf-vfpv4d16-openbmc-linux-gnueabi/mctpd/1.0+git/package/usr/src/debug/mctpd/1.0+git/src/main.cpp' req '/home/wityuan/Desktop/sdk_v09.01/openbmc/build/ast2600-default/workspace/sources/mctpd/src/main.cpp'.

可以删除文件:

build/ast2600-default/tmp/work/armv7ahf-vfpv4d16-openbmc-linux-gnueabi/mctpd/1.0+git/pseudo/files.db

然后再次编译即可。目前比较好的办法还没找到。^_ ^

参考资料:https://wiki.yoctoproject.org/wiki/Pseudo_Abort,
解释信息如下:

Pseudo can suffer from problems where files are created or modified in pseudo's fakeroot context, then deleted outside of it. 
In particular, the inode number for that file may be reused. 
If some later access under pseudo uses that inode number, pseudo can see this and become confused about whether the files are the same file or not. 
Under older behaviour for pseudo, the modes of the old file may be applied to the new one, causing mode permission corruption.

3.3 报错package is not obeying usrmerge distro feature

报错信息如下:

<packagename> package is not obeying usrmerge distro feature. /<path> should be relocated to /usr. [usrmerge]

yocto上看到解释如下:

If usrmerge is in DISTRO_FEATURES, this check will ensure that no package installs files to root (/bin, /sbin, /lib, /lib64) directories. 
If you are seeing this message, it indicates that the do_install step (or perhaps the build process that do_install is calling into, 
e.g. make install is using hardcoded paths instead of the variables set up for this (bindir, sbindir, etc.), and should be changed so that it does.

修改办法直接是修改cmakelist中,将install目录改为/usr下。

3.4 报错Files/directories were installed but not shipped in any package

报错信息具体内容如:

<recipename>: Files/directories were installed but not shipped in any package [installed-vs-shipped]

具体解释可以查看文档:https://docs.yoctoproject.org/ref-manual/qa-checks.html,重点是:

Files have been installed within the do_install task but have not been included in any package by way of the FILES variable

修改办法:

Add the files to FILES for the package you want them to appear in (e.g. FILES:${PN} for the main package).
Delete the files at the end of the do_install task if the files are not needed in any package.

也就是需要对应修改:

FILES:${PN} += "..."
do_install:append() {...
}

最后,解决问题,需要多看官方文档:https://docs.yoctoproject.org/ref-manual/,一遍不够,多看几遍吧。另外,多分析bitbake源码。

这篇关于aspeed2600 openbmc对mctp over pcie的支持分析(支持mctp over pcie)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1118025

相关文章

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

MySQL中读写分离方案对比分析与选型建议

《MySQL中读写分离方案对比分析与选型建议》MySQL读写分离是提升数据库可用性和性能的常见手段,本文将围绕现实生产环境中常见的几种读写分离模式进行系统对比,希望对大家有所帮助... 目录一、问题背景介绍二、多种解决方案对比2.1 原生mysql主从复制2.2 Proxy层中间件:ProxySQL2.3

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

Olingo分析和实践之EDM 辅助序列化器详解(最佳实践)

《Olingo分析和实践之EDM辅助序列化器详解(最佳实践)》EDM辅助序列化器是ApacheOlingoOData框架中无需完整EDM模型的智能序列化工具,通过运行时类型推断实现灵活数据转换,适用... 目录概念与定义什么是 EDM 辅助序列化器?核心概念设计目标核心特点1. EDM 信息可选2. 智能类

Olingo分析和实践之OData框架核心组件初始化(关键步骤)

《Olingo分析和实践之OData框架核心组件初始化(关键步骤)》ODataSpringBootService通过初始化OData实例和服务元数据,构建框架核心能力与数据模型结构,实现序列化、URI... 目录概述第一步:OData实例创建1.1 OData.newInstance() 详细分析1.1.1