Compare commits

...
16 Commits
Author SHA1 Message Date
thebestvibedev 18c02a6bd6 Update stock/hsx.vn.md 2026-07-08 14:20:19 +07:00
thebestvibedev 253b7b3de5 Đầu tư chứng cho mau giàu 2026-07-08 14:20:00 +07:00
thebestvibedev dbe87937a0 Trộm tiếp 2026-07-08 13:53:49 +07:00
thebestvibedev 322f06d77e Trộm chó hahaha 2026-07-08 13:53:01 +07:00
Vitaliy Filippov 5dbc679e16 Fix padded block checksums - v2 2026-07-05 14:09:57 +03:00
Vitaliy Filippov d48864a6be Fix unaligned pointer warnings 2026-07-04 21:40:29 +03:00
Vitaliy Filippov 462482d319 Fix zero-padded big_write checksum verification in the new store 2026-07-04 21:37:22 +03:00
Vitaliy Filippov 5ef9d78461 Release 3.0.15
- QEMU virtual disk migration with enabled iothread is finally fixed correctly.
- Fixed operation of Proxmox VMs with swTPM without enabling NBD for all disks.
- Debian packages are now again built with stable Antietcd released instead of
  the unstable master branch.
- Antietcd cluster mode previously broken in that master branch is fixed. The
  symptom was Antietcd being unable to elect the leader in a cluster.
- Fixed monitor startup with embedded Antietcd when using IPv6.
- Fixed space statistics calculation for FS and S3 pools in the new storage ([PR #127](https://github.com/vitalif/vitastor/pull/127)).
2026-06-28 11:29:38 +03:00
Vitaliy Filippov 1b20010a69 Install npm packages in debian/rules 2026-06-28 11:29:27 +03:00
Vitaliy Filippov d750d00c6f Fix SWTPM in Proxmox 2026-06-27 16:04:51 +03:00
Vitaliy Filippov 66cb564e2c Fix background jobs in etcd_fail test 2026-06-27 15:42:53 +03:00
Vitaliy Filippov f782decbd6 Update antietcd to 1.3.1 2026-06-27 15:42:42 +03:00
Vitaliy Filippov 717582c4ba Use release builds of antietcd&tinyraft in debian packages (not master branch) 2026-06-27 10:27:15 +03:00
Vitaliy Filippov cd62c0755f Fix IPv6 antietcd configuration 2026-06-27 00:16:03 +03:00
c6f5ab7d79 fix pool stats with no_inode_stats (#127)
Co-authored-by: zhu.chengzhen <zhu.chengzhen@jingjiamicro.com>
2026-06-24 12:41:56 +03:00
Vitaliy Filippov 09607ddcbe Actual fix for live migration with iothread 2026-06-23 00:07:34 +03:00
31 changed files with 756 additions and 166 deletions
+1 -1
View File
@@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 2.8...3.30)
project(vitastor)
set(VITASTOR_VERSION "3.0.14")
set(VITASTOR_VERSION "3.0.15")
include(CTest)
+163 -92
View File
@@ -1,112 +1,183 @@
# Vitastor
# tromcho.net
[Читать на русском](README-ru.md)
Repository này chứa toàn bộ source code của website **tromcho.net**.
## The Idea
## Giới thiệu
Make Clustered Block Storage Fast Again.
`tromcho.net` là mã nguồn website được tổ chức để phục vụ phát triển, triển khai và vận hành theo quy trình chuẩn trên GitHub.
README này đóng vai trò tài liệu khởi đầu cho lập trình viên, DevOps engineer và cộng tác viên khi tiếp cận repository.
Vitastor is a distributed block, file and object SDS, direct replacement of Ceph RBD, CephFS and RGW,
and also internal SDS's of public clouds. However, in contrast to them, Vitastor is fast
and simple at the same time. The only thing is it's slightly young :-).
## Mục tiêu repository
Vitastor is architecturally similar to Ceph which means strong consistency,
primary-replication, symmetric clustering and automatic data distribution over any
number of drives of any size with configurable redundancy (replication or erasure codes/XOR).
- Quản lý tập trung toàn bộ source code của website.
- Chuẩn hóa quy trình phát triển, review và triển khai.
- Tạo nền tảng rõ ràng cho việc CI/CD, kiểm thử và vận hành production.
- Hỗ trợ onboarding nhanh cho thành viên mới.
Vitastor targets primarily SSD and SSD+HDD clusters with at least 10 Gbit/s network,
supports TCP and RDMA and may achieve 4 KB read and write latency as low as ~0.1 ms
with proper hardware which is ~10 times faster than other popular SDS's like Ceph
or internal systems of public clouds.
## Cấu trúc thư mục đề xuất
Vitastor supports QEMU, UBLK, NBD, NFS protocols, OpenStack, OpenNebula, Proxmox, Kubernetes drivers.
More drivers may be created easily.
```text
.
├── app/ # Source code ứng dụng chính
├── public/ # Static files, images, favicon, robots.txt
├── config/ # Cấu hình môi trường, app, service integration
├── database/ # Migration, seed, schema
├── tests/ # Unit test, integration test, e2e test
├── scripts/ # Script hỗ trợ build, deploy, backup, maintenance
├── docs/ # Tài liệu kỹ thuật, kiến trúc, quy trình
├── .github/ # GitHub Actions, issue template, PR template
├── Dockerfile # Build image ứng dụng
├── docker-compose.yml # Chạy local/dev bằng container
├── .env.example # Biến môi trường mẫu
└── README.md
```
Read more details in the documentation. You can start from here: [Quick Start](docs/intro/quickstart.en.md).
> Cấu trúc thực tế có thể thay đổi theo framework đang sử dụng.
## Talks and presentations
## Yêu cầu môi trường
- KuberConf'2025: [video](https://vitastor.io/presentation/kuberconf.webm)
- Highload'2025: [video](https://vitastor.io/presentation/hl2025/hl2025.webm),
[youtube](https://www.youtube.com/watch?v=0R8MLjFtz7g), presentation
([in Russian](https://vitastor.io/presentation/hl2025/), [in English](https://vitastor.io/presentation/hl2025/en.html))
- Highload'2022: presentation ([in Russian](https://vitastor.io/presentation/highload/highload.html)),
[video](https://vitastor.io/presentation/highload/talk.webm)
- DevOpsConf'2021: presentation ([in Russian](https://vitastor.io/presentation/devopsconf/devopsconf.html),
[in English](https://vitastor.io/presentation/devopsconf/devopsconf_en.html)),
[video](https://vitastor.io/presentation/devopsconf/talk.webm)
Tùy theo stack công nghệ của website, môi trường phát triển nên có:
## Documentation
- Git
- Docker và Docker Compose
- Node.js / PHP / Python / runtime phù hợp với dự án
- Make (khuyến nghị)
- Truy cập vào file cấu hình môi trường `.env`
- Introduction
- [Quick Start](docs/intro/quickstart.en.md)
- [Features](docs/intro/features.en.md)
- [Architecture](docs/intro/architecture.en.md)
- [Author and license](docs/intro/author.en.md)
- Installation
- [Packages](docs/installation/packages.en.md)
- [Docker](docs/installation/docker.en.md)
- [Proxmox](docs/installation/proxmox.en.md)
- [OpenNebula](docs/installation/opennebula.en.md)
- [OpenStack](docs/installation/openstack.en.md)
- [Kubernetes CSI](docs/installation/kubernetes.en.md)
- [S3](docs/installation/s3.en.md)
- [Building from Source](docs/installation/source.en.md)
- Configuration
- [Overview](docs/config.en.md)
- Parameter Reference
- [Common](docs/config/common.en.md)
- [Network](docs/config/network.en.md)
- [Client](docs/config/client.en.md)
- [Global Disk Layout](docs/config/layout-cluster.en.md)
- [OSD Disk Layout](docs/config/layout-osd.en.md)
- [OSD Runtime Parameters](docs/config/osd.en.md)
- [Monitor](docs/config/monitor.en.md)
- [Pool configuration](docs/config/pool.en.md)
- [Image metadata in etcd](docs/config/inode.en.md)
- Usage
- [vitastor-cli](docs/usage/cli.en.md) (command-line interface)
- [vitastor-disk](docs/usage/disk.en.md) (disk management tool)
- [fio](docs/usage/fio.en.md) for benchmarks
- [UBLK](docs/usage/ublk.en.md) for kernel mounts
- [NBD](docs/usage/nbd.en.md) - old interface for kernel mounts
- [QEMU, qemu-img and VDUSE](docs/usage/qemu.en.md)
- [NFS](docs/usage/nfs.en.md) clustered file system and pseudo-FS proxy
- [Administration](docs/usage/admin.en.md)
- Performance
- [Understanding storage performance](docs/performance/understanding.en.md)
- [Theoretical performance](docs/performance/theoretical.en.md)
- [Example comparison with Ceph](docs/performance/comparison1.en.md)
- [Newer benchmark of Vitastor 1.3.1](docs/performance/bench2.en.md)
## Bắt đầu nhanh
## Author and License
### 1. Clone repository
Copyright (c) Vitaliy Filippov (vitalif [at] yourcmc.ru), 2019+
```bash
git clone https://github.com/<your-org>/tromcho.net.git
cd tromcho.net
```
Join Vitastor Telegram Chat: https://t.me/vitastor
### 2. Tạo file môi trường
All server-side code (OSD, Monitor and so on) is licensed under the terms of
Vitastor Network Public License 1.1 (VNPL 1.1), a copyleft license based on
GNU GPLv3.0 with the additional "Network Interaction" clause which requires
opensourcing all programs directly or indirectly interacting with Vitastor
through a computer network and expressly designed to be used in conjunction
with it ("Proxy Programs"). Proxy Programs may be made public not only under
the terms of the same license, but also under the terms of any GPL-Compatible
Free Software License, as listed by the Free Software Foundation.
This is a stricter copyleft license than the Affero GPL.
```bash
cp .env.example .env
```
Please note that VNPL doesn't require you to open the code of proprietary
software running inside a VM if it's not specially designed to be used with
Vitastor.
Sau đó cập nhật các biến cấu hình cần thiết trong file `.env`.
Basically, you can't use the software in a proprietary environment to provide
its functionality to users without opensourcing all intermediary components
standing between the user and Vitastor or purchasing a commercial license
from the author 😀.
### 3. Chạy môi trường local
Client libraries (cluster_client and so on) are dual-licensed under the same
VNPL 1.1 and also GNU GPL 2.0 or later to allow for compatibility with GPLed
software like QEMU and fio.
Nếu dự án dùng Docker:
You can find the full text of VNPL-1.1 in the file [VNPL-1.1.txt](VNPL-1.1.txt).
GPL 2.0 is also included in this repository as [GPL-2.0.txt](GPL-2.0.txt).
```bash
docker compose up -d --build
```
Nếu dự án chạy trực tiếp theo framework, sử dụng lệnh tương ứng của stack hiện tại.
## Quy trình phát triển
- Tạo branch mới từ `main` hoặc `develop`.
- Đặt tên branch rõ ràng, ví dụ: `feature/homepage-banner`, `fix/login-timeout`.
- Commit ngắn gọn, đúng ngữ cảnh thay đổi.
- Tạo Pull Request để review trước khi merge.
- Không commit file bí mật như `.env`, private key hoặc credential.
## Quy ước commit
Khuyến nghị dùng convention sau:
```text
feat: thêm chức năng mới
fix: sửa lỗi
refactor: tái cấu trúc mã nguồn
chore: cập nhật tác vụ phụ trợ
ci: thay đổi pipeline CI/CD
docs: cập nhật tài liệu
test: bổ sung hoặc cập nhật kiểm thử
```
## CI/CD
Repository nên tích hợp các bước tự động sau:
- Lint source code
- Chạy unit test / integration test
- Build artifact hoặc Docker image
- Scan bảo mật dependency/container
- Deploy tới staging hoặc production theo rule xác định
Ví dụ vị trí cấu hình pipeline:
```text
.github/workflows/
```
## Biến môi trường
Không commit file `.env` thật lên GitHub.
Nên cung cấp `.env.example` với:
- Danh sách biến bắt buộc
- Giá trị mẫu an toàn
- Ghi chú ngắn cho từng biến quan trọng
Ví dụ:
```env
APP_ENV=local
APP_DEBUG=true
APP_URL=http://localhost
DB_HOST=127.0.0.1
DB_PORT=3306
DB_NAME=tromcho
DB_USER=user
DB_PASSWORD=change_me
```
## Triển khai
Khuyến nghị tách rõ các môi trường:
- local
- development
- staging
- production
Các thành phần nên được chuẩn hóa khi triển khai:
- Biến môi trường
- Reverse proxy / web server
- TLS certificate
- Database migration
- Backup strategy
- Log rotation và monitoring
## Bảo mật
- Không đưa secrets vào source code.
- Bật branch protection cho nhánh quan trọng.
- Review dependency định kỳ.
- Áp dụng nguyên tắc least privilege cho tài khoản deploy.
- Theo dõi log, audit và cảnh báo bất thường.
## Đóng góp
Khi đóng góp vào repository:
1. Fork hoặc tạo branch làm việc.
2. Cập nhật mã nguồn theo phạm vi thay đổi.
3. Kiểm tra local trước khi tạo Pull Request.
4. Viết mô tả PR rõ ràng: mục tiêu, phạm vi ảnh hưởng, cách kiểm thử.
## Tài liệu nên bổ sung
Repository này nên có thêm các tài liệu sau trong thư mục `docs/`:
- Kiến trúc hệ thống
- Sơ đồ database
- Luồng deploy
- Quy trình backup/restore
- Hướng dẫn xử lý sự cố
- Checklist release
## License
Copyright 2026 Trộm Chó chấm Nét
---
+1 -1
View File
@@ -1,4 +1,4 @@
VITASTOR_VERSION ?= v3.0.14
VITASTOR_VERSION ?= v3.0.15
all: build push
+1 -1
View File
@@ -49,7 +49,7 @@ spec:
capabilities:
add: ["SYS_ADMIN"]
allowPrivilegeEscalation: true
image: vitalif/vitastor-csi:v3.0.14
image: vitalif/vitastor-csi:v3.0.15
args:
- "--node=$(NODE_ID)"
- "--endpoint=$(CSI_ENDPOINT)"
+1 -1
View File
@@ -121,7 +121,7 @@ spec:
privileged: true
capabilities:
add: ["SYS_ADMIN"]
image: vitalif/vitastor-csi:v3.0.14
image: vitalif/vitastor-csi:v3.0.15
args:
- "--node=$(NODE_ID)"
- "--endpoint=$(CSI_ENDPOINT)"
+1 -1
View File
@@ -5,7 +5,7 @@ package vitastor
const (
vitastorCSIDriverName = "csi.vitastor.io"
vitastorCSIDriverVersion = "3.0.14"
vitastorCSIDriverVersion = "3.0.15"
)
// Config struct fills the parameters of request or user input
+1 -1
View File
@@ -1,4 +1,4 @@
vitastor (3.0.14-1) unstable; urgency=medium
vitastor (3.0.15-1) unstable; urgency=medium
* Bugfixes
+1
View File
@@ -11,6 +11,7 @@ override_dh_install:
cp -v node-binding/package.json node-binding/index.js node-binding/addon.cc node-binding/addon.h node-binding/client.cc node-binding/client.h debian/tmp/usr/lib/x86_64-linux-gnu/nodejs/vitastor
cp -v node-binding/build/Release/addon.node debian/tmp/usr/lib/x86_64-linux-gnu/nodejs/vitastor/build/Release
dh_install
cd debian/vitastor-mon/usr/lib/vitastor/mon && npm install --production
override_dh_installdeb:
cat debian/fio_version >> debian/vitastor-fio.substvars
-6
View File
@@ -37,12 +37,6 @@ rm -rf a b
echo "dep:fio=$FIO" > debian/fio_version
cd /root/vitastor/packages/vitastor-$REL/vitastor-$VER
mkdir mon/node_modules
cd mon/node_modules
curl -s https://git.yourcmc.ru/vitalif/antietcd/archive/master.tar.gz | tar -zx
curl -s https://git.yourcmc.ru/vitalif/tinyraft/archive/master.tar.gz | tar -zx
cd /root/vitastor/packages/vitastor-$REL
if [[ ( "$REL" = "trixie" || "$REL" = "resolute" ) && -e ../vitastor-bookworm/vitastor_$VER.orig.tar.xz ]]; then
# Fucking shit, archives differ between bookworm (xz 5.4.1) and trixie (xz 5.8.1)
+1 -1
View File
@@ -1,4 +1,4 @@
VITASTOR_VERSION ?= v3.0.14
VITASTOR_VERSION ?= v3.0.15
all: build push
+1 -1
View File
@@ -4,7 +4,7 @@
#
# Desired Vitastor version
VITASTOR_VERSION=v3.0.14
VITASTOR_VERSION=v3.0.15
# Additional arguments for all containers
# For example, you may want to specify a custom logging driver here
+2 -2
View File
@@ -26,9 +26,9 @@ at Vitastor Kubernetes operator: https://github.com/Antilles7227/vitastor-operat
The instruction is very simple.
1. Download a Docker image of the desired version: \
`docker pull vitalif/vitastor:v3.0.14`
`docker pull vitalif/vitastor:v3.0.15`
2. Install scripts to the host system: \
`docker run --rm -it -v /etc:/host-etc -v /usr/bin:/host-bin vitalif/vitastor:v3.0.14 install.sh`
`docker run --rm -it -v /etc:/host-etc -v /usr/bin:/host-bin vitalif/vitastor:v3.0.15 install.sh`
3. Reload udev rules: \
`udevadm control --reload-rules`
4. Enable the vitastor-host service: \
+2 -2
View File
@@ -25,9 +25,9 @@ Vitastor можно установить в Docker/Podman. При этом etcd,
Инструкция по установке максимально простая.
1. Скачайте Docker-образ желаемой версии: \
`docker pull vitalif/vitastor:v3.0.14`
`docker pull vitalif/vitastor:v3.0.15`
2. Установите скрипты в хост-систему командой: \
`docker run --rm -it -v /etc:/host-etc -v /usr/bin:/host-bin vitalif/vitastor:v3.0.14 install.sh`
`docker run --rm -it -v /etc:/host-etc -v /usr/bin:/host-bin vitalif/vitastor:v3.0.15 install.sh`
3. Перезагрузите правила udev: \
`udevadm control --reload-rules`
4. Включите сервис vitastor-host: \
+19 -7
View File
@@ -18,7 +18,7 @@ class AntiEtcdAdapter
cluster = cluster ? (''+(cluster||'')).split(/,+/) : [];
cluster = Object.keys(cluster.reduce((a, url) =>
{
a[url.toLowerCase().replace(/^(https?:\/\/)/, '').replace(/\/.*$/, '')] = true;
a[url.toLowerCase().replace(/^(https?:\/\/)?(.*?)(\/.*)?$/, (m, m1, m2) => (m1||'http://')+m2)] = true;
return a;
}, {}));
const cfg_port = config.antietcd_port;
@@ -26,7 +26,18 @@ class AntiEtcdAdapter
is_local['0.0.0.0'] = true;
is_local['::'] = true;
is_local[''] = true;
const selected = cluster.map(s => s.split(':', 2)).filter(ip => is_local[ip[0]] && (!cfg_port || ip[1] == cfg_port));
// split :, 3 -> <schema>:<//ip>:<port>
const selected = [];
for (let i = 0; i < cluster.length; i++)
{
const m = /^(https?:\/\/)?(?:\[(.*)\]|([^\[\:]+))(?::(\d+))?$/.exec(cluster[i]);
if (!m)
continue;
const ip = m[3] || m[2];
const port = m[4] || 2379;
if (is_local[ip] && (!cfg_port || port == cfg_port))
selected.push({ idx: i, ip, port });
}
if (selected.length > 1)
{
console.error('More than 1 etcd_address matches local IPs, please specify port');
@@ -35,15 +46,16 @@ class AntiEtcdAdapter
else if (selected.length == 1)
{
const antietcd_config = {
ip: selected[0][0],
port: selected[0][1],
data: config.antietcd_data_file || ((config.antietcd_data_dir || '/var/lib/vitastor') + '/mon_'+selected[0][1]+'.json.gz'),
ip: selected[0].ip,
port: selected[0].port,
data: config.antietcd_data_file || ((config.antietcd_data_dir || '/var/lib/vitastor') + '/mon_'+selected[0].port+'.json.gz'),
persist_filter: vitastor_persist_filter({ vitastor_prefix: config.etcd_prefix || '/vitastor' }),
node_id: selected[0][0]+':'+selected[0][1], // node_id = ip:port
cluster: (cluster.length == 1 ? null : cluster.reduce((a, c) => { a[c] = "http://"+c; return a; }, {})),
node_id: cluster[selected[0].idx].replace(/^(https?:\/\/)/, ''), // same as in <cluster> below
cluster: (cluster.length == 1 ? null : cluster.reduce((a, c) => { a[c.replace(/^(https?:\/\/)/, '')] = c; return a; }, {})),
cluster_key: (config.etcd_prefix || '/vitastor'),
stale_read: 1,
log_level: 1,
logs: { cluster: true },
};
for (const key in config)
{
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "vitastor-mon",
"version": "3.0.14",
"version": "3.0.15",
"description": "Vitastor SDS monitor service",
"main": "mon-main.js",
"scripts": {
@@ -9,7 +9,7 @@
"author": "Vitaliy Filippov",
"license": "UNLICENSED",
"dependencies": {
"antietcd": "^1.2.4",
"antietcd": "^1.3.1",
"sprintf-js": "^1.1.2",
"ws": "^7.2.5"
},
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "vitastor",
"version": "3.0.14",
"version": "3.0.15",
"description": "Low-level native bindings to Vitastor client library",
"main": "index.js",
"keywords": [
+45 -10
View File
@@ -366,15 +366,38 @@ sub map_volume
my $prefix = defined $scfg->{vitastor_prefix} ? $scfg->{vitastor_prefix} : 'pve/';
my ($vtype, $img_name, $vmid) = $class->parse_volname($volname);
my $name = $img_name;
my $name = $prefix.$img_name;
$name .= '@'.$snapname if $snapname;
my $mapped = run_cli($scfg, [ 'ls' ], binary => '/usr/bin/vitastor-nbd');
my ($kerneldev) = grep { $mapped->{$_}->{image} eq $prefix.$name } keys %$mapped;
return $kerneldev if $kerneldev && -b $kerneldev; # already mapped
my ($kerneldev) = grep {
$mapped->{$_} && $mapped->{$_}->{image} && $mapped->{$_}->{image} eq $name
} keys %$mapped;
$kerneldev = run_cli($scfg, [ 'map', '--image', $prefix.$name ], binary => '/usr/bin/vitastor-nbd', json => 0);
return $kerneldev;
if ($kerneldev && -b $kerneldev)
{
my $size = `/usr/sbin/blockdev --getsize64 $kerneldev`;
return $kerneldev if $size && $size > 0;
}
my $map_out = run_cli($scfg, [ 'map', '--image', $name ], binary => '/usr/bin/vitastor-nbd', json => 0);
$map_out =~ s/^\s+|\s+$//gso;
# Wait until the device is started
for (my $i = 0; $i < 100; $i++)
{
$mapped = run_cli($scfg, [ 'ls' ], binary => '/usr/bin/vitastor-nbd');
($kerneldev) = grep { $mapped->{$_} && $mapped->{$_}->{image} && $mapped->{$_}->{image} eq $name } keys %$mapped;
if ($kerneldev && -b $kerneldev)
{
my $size = `/usr/sbin/blockdev --getsize64 $kerneldev`;
return $kerneldev if $size && $size > 0;
}
select(undef, undef, undef, 0.1);
}
die "Failed to map Vitastor image $name via NBD".
($map_out ? ", vitastor-nbd map returned '$map_out'" : "")."\n";
}
sub unmap_volume
@@ -383,13 +406,19 @@ sub unmap_volume
my $prefix = defined $scfg->{vitastor_prefix} ? $scfg->{vitastor_prefix} : 'pve/';
my ($vtype, $name, $vmid) = $class->parse_volname($volname);
$name = $prefix.$name;
$name .= '@'.$snapname if $snapname;
my $mapped = run_cli($scfg, [ 'ls' ], binary => '/usr/bin/vitastor-nbd');
my ($kerneldev) = grep { $mapped->{$_}->{image} eq $prefix.$name } keys %$mapped;
if ($kerneldev && -b $kerneldev)
my @kerneldevs = grep {
$mapped->{$_} && $mapped->{$_}->{image} && $mapped->{$_}->{image} eq $name
} keys %$mapped;
for my $kerneldev (@kerneldevs)
{
run_cli($scfg, [ 'unmap', $kerneldev ], binary => '/usr/bin/vitastor-nbd', json => 0);
next if !$kerneldev || !-b $kerneldev;
eval { run_cli($scfg, [ 'unmap', $kerneldev ], binary => '/usr/bin/vitastor-nbd', json => 0); };
warn "Failed to unmap Vitastor image $name from $kerneldev: $@" if $@;
}
return 1;
@@ -405,7 +434,13 @@ sub activate_volume
sub deactivate_volume
{
my ($class, $storeid, $scfg, $volname, $snapname, $cache) = @_;
$class->unmap_volume($storeid, $scfg, $volname, $snapname) if $scfg->{vitastor_nbd};
# Even with vitastor_nbd=0, Proxmox may call map_volume() for special
# volumes like tpmstate0 because swtpm needs a local file/block path.
# Therefore, always try to unmap an existing NBD mapping here.
# unmap_volume() is a no-op if the volume is not currently mapped.
$class->unmap_volume($storeid, $scfg, $volname, $snapname);
return 1;
}
+1 -1
View File
@@ -50,7 +50,7 @@ from cinder.volume import configuration
from cinder.volume import driver
from cinder.volume import volume_utils
VITASTOR_VERSION = '3.0.14'
VITASTOR_VERSION = '3.0.15'
LOG = logging.getLogger(__name__)
+2 -2
View File
@@ -1,11 +1,11 @@
Name: vitastor
Version: 3.0.14
Version: 3.0.15
Release: 1%{?dist}
Summary: Vitastor, a fast software-defined clustered block storage
License: Vitastor Network Public License 1.1
URL: https://vitastor.io/
Source0: vitastor-3.0.14.el10.tar.gz
Source0: vitastor-3.0.15.el10.tar.gz
BuildRequires: gperftools-devel
BuildRequires: gcc-c++
+2 -2
View File
@@ -1,11 +1,11 @@
Name: vitastor
Version: 3.0.14
Version: 3.0.15
Release: 1%{?dist}
Summary: Vitastor, a fast software-defined clustered block storage
License: Vitastor Network Public License 1.1
URL: https://vitastor.io/
Source0: vitastor-3.0.14.el7.tar.gz
Source0: vitastor-3.0.15.el7.tar.gz
BuildRequires: gperftools-devel
BuildRequires: devtoolset-9-gcc-c++
+2 -2
View File
@@ -1,11 +1,11 @@
Name: vitastor
Version: 3.0.14
Version: 3.0.15
Release: 1%{?dist}
Summary: Vitastor, a fast software-defined clustered block storage
License: Vitastor Network Public License 1.1
URL: https://vitastor.io/
Source0: vitastor-3.0.14.el8.tar.gz
Source0: vitastor-3.0.15.el8.tar.gz
BuildRequires: gperftools-devel
BuildRequires: gcc-toolset-9-gcc-c++
+2 -2
View File
@@ -1,11 +1,11 @@
Name: vitastor
Version: 3.0.14
Version: 3.0.15
Release: 1%{?dist}
Summary: Vitastor, a fast software-defined clustered block storage
License: Vitastor Network Public License 1.1
URL: https://vitastor.io/
Source0: vitastor-3.0.14.el9.tar.gz
Source0: vitastor-3.0.15.el9.tar.gz
BuildRequires: gperftools-devel
BuildRequires: gcc-c++
+1 -1
View File
@@ -20,7 +20,7 @@ if("${CMAKE_INSTALL_PREFIX}" MATCHES "^/usr/local/?$")
endif()
set(ENABLE_COVERAGE false CACHE BOOL "Enable code coverage")
add_definitions(-DVITASTOR_VERSION="3.0.14")
add_definitions(-DVITASTOR_VERSION="3.0.15")
add_definitions(-D_GNU_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Wall -Wno-sign-compare -Wno-comment -Wno-parentheses -Wno-pointer-arith -fdiagnostics-color=always -fno-omit-frame-pointer -fvisibility=hidden -I ${CMAKE_SOURCE_DIR}/src)
add_link_options(-fno-omit-frame-pointer)
if (${WITH_ASAN})
+3 -3
View File
@@ -1153,7 +1153,7 @@ bool blockstore_heap_t::calc_block_checksums(uint32_t *block_csums, uint8_t *bit
while (pos < end && pos < block_end && !(bitmap[pos/dsk->bitmap_granularity/8] & (1 << ((pos/dsk->bitmap_granularity) % 8))))
pos += dsk->bitmap_granularity;
// zero padding at the beginning or at the end of the block is not counted
if (pos > prev && prev > 0 && pos < block_end)
if (pos > prev && prev > blk_start && pos < block_end)
block_crc = crc32c_pad(block_crc, NULL, 0, pos-prev, 0);
prev = pos;
while (pos < end && pos < block_end && (bitmap[pos/dsk->bitmap_granularity/8] & (1 << ((pos/dsk->bitmap_granularity) % 8))))
@@ -2300,7 +2300,7 @@ void blockstore_heap_t::use_data(inode_t inode, uint64_t location)
{
auto sh_it = pool_shard_settings.find(INODE_POOL(inode));
if (sh_it != pool_shard_settings.end() && sh_it->second.no_inode_stats)
inode = (INODE_POOL(inode) << POOL_ID_BITS);
inode = INODE_WITH_POOL(INODE_POOL(inode), 0);
assert(!data_alloc->get(location / dsk->data_block_size));
data_alloc->set(location / dsk->data_block_size, true);
inode_space_stats[inode] += dsk->data_block_size;
@@ -2311,7 +2311,7 @@ void blockstore_heap_t::free_data(inode_t inode, uint64_t location)
{
auto sh_it = pool_shard_settings.find(INODE_POOL(inode));
if (sh_it != pool_shard_settings.end() && sh_it->second.no_inode_stats)
inode = (INODE_POOL(inode) << POOL_ID_BITS);
inode = INODE_WITH_POOL(INODE_POOL(inode), 0);
assert(data_alloc->get(location / dsk->data_block_size));
data_alloc->set(location / dsk->data_block_size, false);
auto sp_it = inode_space_stats.find(inode);
+25
View File
@@ -880,6 +880,25 @@ static int vitastor_refresh_limits(BlockDriverState *bs)
// return 0;
//}
// Move the running coroutine to the BlockDriverState's home AioContext.
//
// The block-coroutine-wrapper generator sets poll_state.ctx to
// qemu_get_current_aio_context() in the sync wrappers (bdrv_flush(),
// bdrv_pread() etc.). When bdrv_flush_all() runs under BQL from outside the
// bs's iothread (e.g. on the migration thread inside do_vm_stop()), that is
// the main AioContext, not the iothread that actually owns the bs. The
// coroutine then runs on the wrong context while completions are delivered on
// the iothread, and racing aio_co_schedule() vs. qemu_aio_coroutine_enter()
// on the same coroutine triggers "Co-routine was already scheduled in
// aio_co_schedule" and aborts the process (observed during live migration).
//
// aio_co_reschedule_self() is a no-op when we are already on the target ctx.
#if QEMU_VERSION_MAJOR > 5 || QEMU_VERSION_MAJOR == 5 && QEMU_VERSION_MINOR >= 2
#define vitastor_co_pin_to_bs_ctx(bs) aio_co_reschedule_self(bdrv_get_aio_context(bs))
#else
#define vitastor_co_pin_to_bs_ctx(bs) ((void)0)
#endif
static void vitastor_co_init_task(BlockDriverState *bs, VitastorRPC *task)
{
*task = (VitastorRPC) {
@@ -938,6 +957,7 @@ static int coroutine_fn vitastor_co_preadv(BlockDriverState *bs,
{
VitastorClient *client = bs->opaque;
VitastorRPC task;
vitastor_co_pin_to_bs_ctx(bs);
vitastor_co_init_task(bs, &task);
task.iov = iov;
@@ -966,6 +986,7 @@ static int coroutine_fn vitastor_co_pwritev(BlockDriverState *bs,
{
VitastorClient *client = bs->opaque;
VitastorRPC task;
vitastor_co_pin_to_bs_ctx(bs);
vitastor_co_init_task(bs, &task);
task.iov = iov;
@@ -1039,6 +1060,7 @@ static int coroutine_fn vitastor_co_block_status(BlockDriverState *bs,
#endif
VitastorRPC task;
VitastorClient *client = bs->opaque;
vitastor_co_pin_to_bs_ctx(bs);
uint64_t inode = client->watch ? vitastor_c_inode_get_num(client->watch) : client->inode;
uint8_t bit = 0;
if (client->last_bitmap && client->last_bitmap_inode == inode &&
@@ -1151,6 +1173,7 @@ static int coroutine_fn vitastor_co_flush(BlockDriverState *bs)
{
VitastorClient *client = bs->opaque;
VitastorRPC task;
vitastor_co_pin_to_bs_ctx(bs);
vitastor_co_init_task(bs, &task);
qemu_mutex_lock(&client->mutex);
@@ -1236,6 +1259,8 @@ static BlockDriver bdrv_vitastor = {
#endif
.bdrv_close = vitastor_close,
// Re-register fd handlers when the bs is moved to a different AioContext
// (live migration, drain, iothread reassignment).
.bdrv_detach_aio_context = vitastor_detach_aio_context,
.bdrv_attach_aio_context = vitastor_attach_aio_context,
+1 -1
View File
@@ -6,7 +6,7 @@ includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
Name: Vitastor
Description: Vitastor client library
Version: 3.0.14
Version: 3.0.15
Libs: -L${libdir} -lvitastor_client
Cflags: -I${includedir}
+6 -2
View File
@@ -88,15 +88,17 @@ int osd_t::read_bitmaps(osd_op_t *cur_op, pg_t *pg, int base_state)
{
// Happy path for clean replicated PGs (all bitmaps are available locally)
osd_primary_op_data_t *op_data = cur_op->op_data;
uint64_t version = 0;
for (int chain_num = 0; chain_num < op_data->chain_size; chain_num++)
{
object_id cur_oid = { .inode = op_data->read_chain[chain_num], .stripe = op_data->oid.stripe };
// Read bitmap synchronously from the local database
bs->read_bitmap(
cur_oid, UINT64_MAX, (uint8_t*)op_data->snapshot_bitmaps + chain_num*clean_entry_bitmap_size,
!chain_num ? &cur_op->reply.rw.version : NULL
!chain_num ? &version : NULL
);
}
cur_op->reply.rw.version = version;
}
else
{
@@ -269,13 +271,15 @@ int osd_t::submit_bitmap_subops(osd_op_t *cur_op, pg_t & pg)
if (subop_osd_num == this->osd_num)
{
// Read bitmap synchronously from the local database
uint64_t version = 0;
for (int j = prev; j <= i; j++)
{
bs->read_bitmap(
(*bitmap_requests)[j].oid, (*bitmap_requests)[j].version, (*bitmap_requests)[j].bmp_buf,
(*bitmap_requests)[j].oid.inode == cur_op->req.rw.inode ? &cur_op->reply.rw.version : NULL
(*bitmap_requests)[j].oid.inode == cur_op->req.rw.inode ? &version : NULL
);
}
cur_op->reply.rw.version = version;
}
else
{
+97 -17
View File
@@ -57,6 +57,19 @@ struct bs_test_t
}
}
void force_compaction()
{
bs->flusher->dump_diagnostics();
bs->flusher->request_trim();
while (bs->heap->get_compact_queue_size())
ringloop->loop();
while (bs->flusher->is_active())
ringloop->loop();
bs->flusher->release_trim();
// Check that compaction succeeded
assert(!bs->heap->get_to_compact_count());
}
void default_cfg()
{
config["data_device"] = "./test_data.bin";
@@ -330,15 +343,7 @@ static void test_fsync(bool separate_meta)
assert(is_zero(op2.buf+24*1024, 104*1024));
// Trigger & wait compaction
test.bs->flusher->dump_diagnostics();
test.bs->flusher->request_trim();
while (test.bs->heap->get_compact_queue_size())
test.ringloop->loop();
while (test.bs->flusher->is_active())
test.ringloop->loop();
test.bs->flusher->release_trim();
// Check that compaction succeeded
assert(!test.bs->heap->get_to_compact_count());
test.force_compaction();
// Restart and check data again
test.destroy_bs();
@@ -447,6 +452,7 @@ static void test_padded_csum_intent(bool perfect)
assert(!test.bs->heap->prev(wr));
// Trigger & wait compaction
test.bs->flusher->dump_diagnostics();
test.bs->flusher->request_trim();
while (test.bs->heap->get_compact_queue_size())
test.ringloop->loop();
@@ -666,14 +672,7 @@ static void test_compact_rollback()
assert(op.retval == 0);
// Trigger & wait compaction
test.bs->flusher->request_trim();
while (test.bs->heap->get_compact_queue_size())
test.ringloop->loop();
while (test.bs->flusher->is_active())
test.ringloop->loop();
test.bs->flusher->release_trim();
// Check that compaction succeeded
assert(!test.bs->heap->get_to_compact_count());
test.force_compaction();
// Check that the object does not exist
printf("checking that the object does not exist\n");
@@ -834,6 +833,86 @@ static void test_fsync_batch_big()
free(op2.buf);
}
static void test_padded_csum_sparse_leading_hole()
{
printf("\n-- test_padded_csum_sparse_leading_hole\n");
bs_test_t test;
test.default_cfg();
test.config["csum_block_size"] = "16384";
test.init();
// Initial write at offset=20K, len=4K on a fresh object.
// The csum block is [16K..32K); granule [16K..20K) is a leading hole.
printf("writing 20+4K\n");
blockstore_op_t op;
op.opcode = BS_OP_WRITE_STABLE;
op.oid = { .inode = 1, .stripe = 0 };
op.version = 1;
op.offset = 20*1024;
op.len = 4096;
op.buf = (uint8_t*)memalign_or_die(MEM_ALIGNMENT, 4096);
memset(op.buf, 0xaa, 4096);
test.exec_op(&op);
assert(op.retval == op.len);
// Read it back - without the fix, verify_read_checksums returns -EDOM
// because the recomputed CRC includes zero-padding for [16K..20K) while
// the stored CRC was computed only over [20K..24K).
printf("reading\n");
blockstore_op_t op2;
op2.opcode = BS_OP_READ;
op2.oid = { .inode = 1, .stripe = 0 };
op2.version = UINT64_MAX;
op2.offset = 0;
op2.len = 128*1024;
op2.buf = (uint8_t*)memalign_or_die(MEM_ALIGNMENT, 128*1024);
test.exec_op(&op2);
assert(op2.retval == op2.len);
assert(is_zero(op2.buf, 20*1024));
assert(memcheck(op2.buf+20*1024, 0xaa, 4*1024));
assert(is_zero(op2.buf+24*1024, 104*1024));
// Part 2 - add 2 more small writes
printf("writing 24+4K\n");
op.version = 2;
op.offset = 24*1024;
test.exec_op(&op);
assert(op.retval == op.len);
printf("writing 36+4K\n");
op.version = 3;
op.offset = 36*1024;
test.exec_op(&op);
assert(op.retval == op.len);
printf("reading uncompacted\n");
op2.version = UINT64_MAX;
test.exec_op(&op2);
assert(op2.retval == op2.len);
assert(is_zero(op2.buf, 20*1024));
assert(memcheck(op2.buf+20*1024, 0xaa, 8*1024));
assert(is_zero(op2.buf+28*1024, 8*1024));
assert(memcheck(op2.buf+36*1024, 0xaa, 4*1024));
assert(is_zero(op2.buf+40*1024, 88*1024));
// Trigger & wait compaction
test.force_compaction();
printf("reading compacted\n");
op2.version = UINT64_MAX;
test.exec_op(&op2);
assert(op2.retval == op2.len);
assert(is_zero(op2.buf, 20*1024));
assert(memcheck(op2.buf+20*1024, 0xaa, 8*1024));
assert(is_zero(op2.buf+28*1024, 8*1024));
assert(memcheck(op2.buf+36*1024, 0xaa, 4*1024));
assert(is_zero(op2.buf+40*1024, 88*1024));
free(op.buf);
free(op2.buf);
}
// FIXME Add a simple intent_write / big_intent test
int main(int narg, char *args[])
@@ -844,6 +923,7 @@ int main(int narg, char *args[])
test_intent_over_unstable();
test_padded_csum_intent(false);
test_padded_csum_intent(true);
test_padded_csum_sparse_leading_hole();
test_perfect_csum_interrupted();
test_padded_csum_parallel_read(false, 8192);
test_padded_csum_parallel_read(true, 8192);
+47
View File
@@ -2719,6 +2719,52 @@ void test_postpone_load()
assert(obj);
assert(count_writes(heap, obj) == 11);
}
printf("OK test_postpone_load\n");
}
void test_big_padded_csum()
{
blockstore_disk_t dsk;
_test_init(dsk, true, [](std::map<std::string, std::string> & config)
{
config["csum_block_size"] = "32k";
});
std::vector<uint8_t> buffer_area(dsk.journal_device_size);
blockstore_heap_t heap(&dsk, buffer_area.data());
heap.finish_recheck();
{
memset(buffer_area.data()+4096, 0xab, 4*1024);
_test_big_write(heap, dsk, 1, 0, 1, 0, true, 36*1024, 4*1024, buffer_area.data()+4096);
object_id oid = { .inode = INODE_WITH_POOL(1, 1), .stripe = 0 };
heap_entry_t *obj = heap.lock_and_read_entry(oid);
assert(obj);
// Read the whole checksum block and verify its checksum
bool csum_ok = heap.calc_block_checksums(
(uint32_t*)obj->get_checksums(&heap) + 1, buffer_area.data(), obj->get_int_bitmap(&heap),
32*1024, 32*1024+32*1024, false, [](uint32_t, uint32_t, uint32_t) {}
);
assert(csum_ok);
// Part 2 - check internal padding
memset(buffer_area.data()+12*1024, 0xab, 4*1024);
std::vector<uint8_t> bitmap(dsk.clean_entry_bitmap_size);
bitmap_set(bitmap.data(), 36*1024, 4*1024, 4096);
bitmap_set(bitmap.data(), 44*1024, 4*1024, 4096);
std::vector<uint8_t> new_csums(dsk.data_block_size/32768*4);
memcpy(new_csums.data(), obj->get_checksums(&heap), new_csums.size());
((uint32_t*)new_csums.data())[1] = crc32c(0, buffer_area.data()+4*1024, 12*1024);
csum_ok = heap.calc_block_checksums(
(uint32_t*)new_csums.data() + 1, buffer_area.data(), bitmap.data(),
32*1024, 32*1024+32*1024, false, [](uint32_t, uint32_t, uint32_t) {}
);
assert(csum_ok);
}
printf("OK test_big_padded_csum\n");
}
// FIXME: Add a test for big_intent, incl. explicit_complete with big_intent over big_write over deletion over big_write :)
@@ -2759,5 +2805,6 @@ int main(int narg, char *args[])
test_explicit_complete();
test_skip_double_claim();
test_postpone_load();
test_big_padded_csum();
return 0;
}
+317
View File
@@ -0,0 +1,317 @@
# Bí quyết đầu tư chứng khoán tỉ xuất lợi nhuận 1000% tuần 06/07 - 10/07
## Diễn biến TTCK thế giới
- TTCK Mỹ phục hồi nhờ báo cáo việc làm yếu hơn dự kiến giúp giảm bớt lo ngại thắt chặt tiền tệ.
- Tăng trưởng việc làm tại Mỹ giảm mạnh trong tháng 6.
- Số lượng việc làm mở mới tại Mỹ tăng lên mức cao nhất 2 năm.
- Tăng trưởng ngành sản xuất ISM của Mỹ giảm tốc trong tháng 6.
- Đồng Yên Nhật giảm xuống mức thấp nhất 40 năm so với USD.
- Dòng vốn quốc tế tiếp tục giảm tại Châu Á.
## Diễn biến thị trường chứng khoán toàn cầu
TTCK toàn cầu phục hồi và phân hóa trước dữ liệu việc làm Mỹ và diễn biến nhóm cổ phiếu AI.
### Chỉ số chính
| Chỉ số/Tài sản | Last | Weekly | YTD | P/E | P/B |
|---|---:|---:|---:|---:|---:|
| S&P 500 Index | 7,483.2 | 1.76% | 9.32% | 27.48 | 5.74 |
| Dow Jones | 52,900.1 | 1.97% | 10.06% | 25.42 | 6.13 |
| Europe SXXP | 652.8 | 2.66% | 10.23% | 18.14 | 2.50 |
| Nikkei 225 | 69,744.1 | 0.55% | 38.55% | 25.30 | 3.14 |
| CN-Shanghai | 4,043.6 | 0.41% | 1.88% | 20.16 | 1.56 |
| Korea-Kospi | 8,088.3 | -3.84% | 91.93% | 22.20 | 2.31 |
| HongKong | 23,350.0 | 2.99% | -8.90% | 12.17 | 1.22 |
| VN-Index | 1,862.1 | -0.53% | 4.35% | 15.26 | 2.12 |
| Malaysia | 1,679.1 | 0.68% | -0.06% | 14.40 | 1.59 |
| SET Index | 1,611.3 | 4.47% | 27.91% | 16.99 | 1.49 |
| Indonesia | 5,875.8 | -0.35% | -32.05% | 14.05 | 1.56 |
| Phillippines | 6,188.0 | 1.91% | 2.23% | 9.46 | 1.28 |
| India | 77,763.9 | 0.86% | -8.75% | 22.00 | 3.11 |
| WTI | 68.7 | -0.78% | 19.63% | | |
| Gold | 4,176.9 | 2.16% | -3.30% | | |
| Bitcoin | 62,715.8 | 5.18% | -28.45% | | |
## Toàn cảnh thông tin tác động đến diễn biến TTCK thế giới trong tuần qua
- TTCK Mỹ phục hồi nhờ báo cáo việc làm yếu hơn dự kiến giúp giảm bớt lo ngại thắt chặt tiền tệ. Tuy nhiên nhóm công nghệ tăng trưởng cao vẫn biến động mạnh, đặc biệt là cổ phiếu chip và hạ tầng AI. Kết thúc tuần, S&P 500 tăng 1,76%, Nasdaq tăng 2,1% và Dow Jones tăng khoảng 1,99%, cho thấy dòng tiền vẫn tìm đến các lĩnh vực ổn định hơn giữa bối cảnh biến động mạnh ở công nghệ.
- Thị trường lao động Mỹ hạ nhiệt rõ nét, làm giảm kỳ vọng Fed tăng lãi suất. Nền kinh tế chỉ tạo thêm 57.000 việc làm phi nông nghiệp trong tháng 6, thấp hơn nhiều dự báo 110.000 việc làm; tỷ lệ thất nghiệp giữ ở 4,2%.
- Việc làm khu vực tư nhân Mỹ tăng chậm hơn dự báo trong tháng 6. Báo cáo ADP ghi nhận 98.000 việc làm mới, thấp hơn kỳ vọng 118.000, phản ánh doanh nghiệp ngày càng thận trọng trong tuyển dụng.
- Chủ tịch Fed cho rằng rủi ro lạm phát đã giảm bớt nhưng vẫn cần thận trọng. Ông Kevin Warsh nhấn mạnh Fed tiếp tục cam kết đưa lạm phát về mục tiêu 2%; trong bối cảnh áp lực giá và thị trường lao động cùng hạ nhiệt.
- Thâm hụt thương mại hàng hóa của Mỹ tăng mạnh lên mức cao nhất hơn một năm. Tháng 5/2026, thâm hụt tăng 27,4% lên 105,8 tỷ USD do xuất khẩu giảm mạnh, nhập khẩu tăng, phản ánh nhu cầu nội địa ổn định dù lạm phát cao.
- Số đơn xin trợ cấp thất nghiệp Mỹ theo tuần đi ngang ở vùng cao. Tuần kết thúc ngày 27/6, số đơn xin trợ cấp thất nghiệp lần đầu ở mức 215.000, bằng tuần trước nhưng thấp hơn dự báo thị trường 220.000.
- Niềm tin người tiêu dùng Mỹ cải thiện nhẹ nhưng lo ngại việc làm gia tăng. Chỉ số Consumer Confidence tăng lên 91,2 điểm trong tháng 6, song tỷ lệ người cho rằng khó tìm việc đã lên mức cao nhất kể từ đầu năm 2021.
- Lạm phát Eurozone tiếp tục giảm nhưng vẫn cao hơn mục tiêu của ECB tháng thứ 4. CPI tháng 6 tăng 2,8%, thấp hơn tháng trước và dưới dự báo nhưng cao hơn mục tiêu 2%, khiến kỳ vọng ECB tăng lãi suất cuối năm vẫn được duy trì.
- Giá dầu thô đã giảm về vùng trước khi xung đột diễn ra Mỹ–Iran. Eo biển Hormuz mở cửa trở lại và đàm phán hòa bình tiến triển giúp giá dầu Brent và WTI về mức trước chiến sự lần lượt khoảng 72 và 68 USD/thùng.
- Giới đầu tư bắt đầu tính tới kịch bản đồng yên giảm sâu về 180200 JPY/USD. Dù được xem là kịch bản cực đoan nhưng nguy cơ vẫn có thể xảy ra khi Fed có lập trường cứng rắn và BOJ chậm bình thường hóa chính sách tiền tệ.
- Lạm phát Hàn Quốc tăng lên mức cao nhất kể từ cuối năm 2023. CPI tháng 6 tăng 3,2% so với cùng kỳ, cao hơn tháng trước, trong khi lạm phát lõi duy trì ở 2,5%.
- Lợi nhuận công nghiệp Trung Quốc bất ngờ giảm tốc do nhu cầu nội địa yếu. Tháng 5/2026, lợi nhuận công nghiệp chỉ tăng 21,1% so với cùng kỳ, thấp hơn tháng trước (24,7%) và đánh dấu lần giảm tốc đầu tiên kể từ cuối năm 2025.
- Cước vận tải biển toàn cầu tăng vọt do làn sóng nhập hàng trước thuế. Các doanh nghiệp Âu Mỹ đẩy mạnh nhập khẩu khiến chỉ số cước container toàn cầu tăng khoảng 80% trong 30 ngày và lên mức cao nhất kể từ năm 2022.
- Đồng Yên Nhật giảm xuống mức thấp nhất 40 năm so với USD. Đồng yên tiếp tục chịu áp lực giảm mạnh trong nửa đầu năm 2026, dao động quanh mức 161.17 JPY/USD gần mức thấp lịch sử 40 năm.
## TTCK Mỹ phục hồi nhờ báo cáo việc làm yếu hơn dự kiến giúp giảm bớt lo ngại thắt chặt tiền tệ
- Tuần vừa qua, TTCK Mỹ phục hồi tăng điểm trở lại nhờ báo cáo việc làm yếu hơn dự kiến khiến các nhà đầu tư giảm kỳ vọng về việc Cục Dự trữ Liên bang (Fed) tăng lãi suất trong năm nay. Tuy nhiên nhóm công nghệ tăng trưởng cao vẫn biến động mạnh đặc biệt là cổ phiếu chip và hạ tầng AI. Kết thúc tuần, S&P 500 tăng 1,76%, Nasdaq tăng 2,1% và Dow Jones tăng khoảng 1,99%, cho thấy dòng tiền vẫn tìm đến các lĩnh vực ổn định hơn giữa bối cảnh biến động mạnh ở công nghệ.
- Về vĩ mô, báo cáo việc làm tháng 6 yếu hơn dự kiến (chỉ tăng 57.000 việc làm so với dự báo 110.000, số liệu tháng trước cũng bị điều chỉnh giảm) đã khiến thị trường giảm kỳ vọng Fed tăng lãi suất. Chủ tịch Fed Kevin Warsh phát biểu rằng rủi ro lạm phát đã giảm bớt, dù vẫn khẳng định cam kết đưa lạm phát về mục tiêu 2% dài hạn. Tâm lý thị trường được hỗ trợ phần nào bởi dữ liệu lao động yếu, giảm bớt áp lực thắt chặt tiền tệ. Tuần tới, thị trường sẽ tiếp tục theo dõi thông tin từ biên bản cuộc họp FOMC tháng 6, PMI dịch vụ ISM, diễn biến đồng Yên và trái phiếu chính phủ Nhật Bản trong bối cảnh còn nhiều nhiễu động.
## Tăng trưởng việc làm tại Mỹ giảm mạnh trong tháng 6
- Nền kinh tế Mỹ đã tạo thêm 57.000 việc làm trong tháng 6/2026, thấp hơn nhiều so với con số 129.000 được điều chỉnh giảm trong tháng 5 và dự báo 110.000. Đây là mức tăng trưởng việc làm thấp nhất trong bốn tháng. Trong tháng 6, việc làm tiếp tục có xu hướng tăng trong các lĩnh vực dịch vụ chuyên nghiệp và kinh doanh (36.000), trợ giúp xã hội (+25.000) và chăm sóc sức khỏe (+22.000). Trong khi đó, việc làm hầu như không thay đổi trong tháng ở các ngành công nghiệp chính khác.
- Tổng số việc làm phi nông nghiệp trong tháng 4 và tháng 5 đã được điều chỉnh giảm tổng cộng 74.000.
- Tỷ lệ thất nghiệp của Mỹ đã giảm xuống 4,2% trong tháng 6 năm 2026, giảm so với mức 4,3% trong tháng 5 và thấp hơn dự kiến, do nhiều người rời bỏ lực lượng lao động. Trong khi đó, thu nhập bình quân theo giờ đã tăng nhẹ lên 3,5% so với cùng kỳ năm ngoái, sau mức tăng 3,4% trong tháng 5 và cũng phù hợp với ước tính của thị trường.
## Số lượng việc làm mở mới tại Mỹ tăng lên mức cao nhất 2 năm
- Số lượng việc làm mở mới tại Mỹ đã tăng 9.000 lên 7,594 triệu trong tháng 5 năm 2026, mức cao nhất kể từ tháng 5 năm 2024 và vượt xa kỳ vọng của thị trường là 7,30 triệu, cho thấy khả năng phục hồi của nhu cầu tuyển dụng dù bất chấp chi phí năng lượng tăng cao do xung đột Iran.
- Nhu cầu việc làm tuyển dụng mới tăng lên trong lĩnh vực thương mại bán buôn (+71.000), dịch vụ lưu trú và ăn uống (+62.000), bất động sản và cho thuê (+40.000), nhưng giảm trong lĩnh vực chăm sóc sức khỏe và trợ giúp xã hội (-115.000) và tài chính và bảo hiểm (-69.000).
- Trong tháng, số lượng người được tuyển dụng không thay đổi ở mức 5,2 triệu, trong khi tổng số người thôi việc thay đổi không đáng kể ở mức 5,1 triệu. Dữ liệu này cho thấy nhu cầu tuyển dụng phục hồi nhẹ, nhưng thị trường lao động vẫn khá “bình ổn”.
## Tăng trưởng ngành sản xuất ISM của Mỹ giảm tốc trong tháng 6
- Chỉ số PMI sản xuất ISM của Mỹ đã giảm xuống 53,3 trong tháng 6 năm 2026, giảm so với mức 54,0 trong tháng 5 và thấp hơn kỳ vọng của thị trường là 54. Số liệu mới nhất cho thấy sự chậm lại trong lĩnh vực sản xuất, đơn hàng mới giảm từ 56,8 xuống 56,0, sản lượng giảm từ 54,3 xuống còn 52,2.
- Việc làm dù cải thiện nhẹ lên 49,7% vẫn ở vùng co hẹp, đánh dấu tháng thứ 33 liên tiếp giảm lao động trong ngành sản xuất.
- Trong khi đó, chỉ số giá cả giảm mạnh xuống 73,0 từ 82,1, cho thấy áp lực chi phí đã giảm bớt, mặc dù tốc độ tăng giá vẫn ở mức cao.
## Đồng Yên Nhật giảm xuống mức thấp nhất 40 năm so với USD
- Đồng yên tiếp tục chịu áp lực giảm mạnh trong nửa đầu năm 2026, dao động quanh mức 161.17 JPY/USD gần mức thấp lịch sử 40 năm.
- Điều đáng chú ý nhất không phải là mức 161.17 mà là nghịch lý cấu trúc giữa ba khung: chênh lệch lãi suất chính sách BOJFed đã thu hẹp từ khoảng -5.5% (đỉnh 2023) về -2.75%; chênh lệch lợi suất 10Y JGBUST cũng thu hẹp từ khoảng -4.5% về -1.71%; tuy nhiên USD/JPY vẫn leo lên đỉnh 4 thập kỷ và vị thế short JPY ở mức cực đại -13.6 tỷ USD.
- Do đó, nhà đầu tư Nhật liên tục đưa vốn ra nước ngoài do lợi suất nội địa kém hấp dẫn. Trong 4 tháng đầu 2026, nhà đầu tư Nhật vẫn mua ròng 1.91 nghìn tỷ Yên cổ phiếu Mỹ và 826.4 tỷ Yên cổ phiếu châu Âu.
## Dòng vốn quốc tế tiếp tục giảm tại Châu Á
- Tuần vừa qua, dòng vốn vào thị trường Châu Á tiếp tục giảm trong bối cảnh nhóm ngành cổ phiếu công nghệ vẫn chịu áp lực, với diễn biến rút vốn mạnh tiếp tục tăng tại: Hàn Quốc, Nhật Bản, Đài Loan, Indonesia, Malaysia, Vietnam.
- Ngược lại, xu hướng mua ròng quay trở lại tại Ấn Độ và Thái Lan.
### Foreign Portfolio Investment Equity
| Country | Weekly | MTD | QTD | YTD | 12M | YOY LvL |
|---|---:|---:|---:|---:|---:|---:|
| India | 50.76 | 14.80 | 14.80 | -28,950.49 | -39,587.27 | -30,429.31 |
| Indonesia | -152.98 | -45.42 | -45.42 | -4,293.62 | -2,076.53 | -259.03 |
| Malaysia | -98.50 | -67.30 | -67.30 | -767.00 | -3,157.50 | -6,039.80 |
| Philippines | -2.79 | -2.28 | -2.28 | -247.21 | -557.22 | -124.79 |
| Thailand | 611.30 | 210.03 | 210.03 | 1,090.76 | 239.92 | 3,457.67 |
| Vietnam | -73.35 | -3.83 | -3.83 | -2,942.86 | -6,141.04 | -3,228.38 |
| Taiwan | -1,199.62 | -1,622.60 | -3,940.36 | -21,982.65 | -28,107.85 | -3,490.35 |
| S.Korea | -12,969.87 | -5,358.40 | -3,908.43 | -100,175.21 | -94,442.16 | -70,288.18 |
| Japan | -11,230.99 | -17,531.70 | 64,701.15 | 53,009.10 | 91,697.73 | 122,105.29 |
## Diễn biến TTCK Việt Nam
- Chỉ số VN-Index giảm điểm nhẹ song xu hướng đi ngang trong biên độ hẹp.
- Thanh khoản toàn thị trường tiếp tục giảm và neo giữ ở nền thấp.
- NĐTNN duy trì chuỗi bán ròng sang tuần thứ 12 liên tiếp.
- Dự báo xu hướng: Chỉ số VN-Index đi ngang tích lũy trong biên độ dao động hẹp quanh vùng kháng cự/hỗ trợ 1.8401.880 trước khi vượt qua vùng này hướng tới vùng đỉnh cũ 1.9151.930 điểm.
## Toàn cảnh thông tin tác động đến TTCK Việt Nam trong tuần qua
### Tin vĩ mô
- Tỷ giá điều hành USD tuần qua tăng 8 đồng lên mức 25.203 đồng/USD. Tỷ giá liên ngân hàng ở mức 26.303 đồng/USD. Lãi suất qua đêm liên ngân hàng tăng mạnh ngày cuối quý 2 sau đó điều chỉnh nhưng vẫn ở mức hơn 6% đến hết tuần.
- Tăng trưởng kinh tế duy trì đà tích cực trong nửa đầu năm 2026. GDP quý II tăng 8,39%, đưa tăng trưởng 6 tháng đầu năm lên 8,18%, cao hơn mức 7,63% cùng kỳ năm trước nhưng cần tăng mạnh hơn cuối năm để đạt mục tiêu trên 10% cả năm.
- Lạm phát vẫn ở mức tương đối cao dù giá xăng dầu hạ nhiệt. CPI tháng 6 tăng 4,69% so với cùng kỳ năm trước; bình quân 6 tháng đầu năm tăng 4,38%, trong khi lạm phát cơ bản tăng 4,12%.
- Đến ngày 26/6/2026, tăng trưởng tín dụng đạt 7,41%. Dư nợ tín dụng toàn hệ thống đạt hơn 19,97 triệu tỷ đồng, tăng 18,1% so với cùng kỳ 2025.
- NHNN bơm thanh khoản ngắn hạn cho hệ thống ngân hàng trước cuối quý II thông qua nghiệp vụ hoán đổi ngoại tệ kỳ hạn 7 ngày với quy mô tối đa 1 tỷ USD, có thể bổ sung gần 24.000 tỷ đồng cho hệ thống ngày 30/6.
- Ngân sách Nhà nước bội thu 419.000 tỷ đồng trong nửa đầu năm 2026. Tổng thu ngân sách ước đạt 1,56 triệu tỷ đồng, tăng 17,4% so với cùng kỳ và hoàn thành khoảng 62% dự toán năm, trong khi tổng chi đạt 1,15 triệu tỷ đồng, tăng nhẹ 0,1%.
- NHNN xem xét điều chỉnh cách tính tiền gửi Kho bạc Nhà nước để nới dư địa tín dụng.
- Tiêu dùng nội địa duy trì đà phục hồi tích cực. Tổng mức bán lẻ hàng hóa và doanh thu dịch vụ tiêu dùng tháng 6/2026 tăng 14,8% so với cùng kỳ; lũy kế 6 tháng đầu năm tăng 12,9%.
- PMI sản xuất duy trì trên ngưỡng mở rộng tháng thứ 12 liên tiếp. Chỉ số PMI tháng 6 đạt 51,8 điểm, giảm nhẹ so với tháng 5 nhưng vẫn trên 50 điểm.
- Sản xuất công nghiệp tăng mạnh nhất kể từ năm 2019. Chỉ số sản xuất công nghiệp (IIP) 6 tháng đầu năm 2026 tăng 10,8%.
- Thương mại quốc tế đầu năm tăng trưởng mạnh nhưng vẫn nhập siêu 16,65 tỷ USD. Kim ngạch xuất nhập khẩu 6 tháng đạt 549,69 tỷ USD, tăng 27,1% so với cùng kỳ.
- FDI vào Việt Nam tiếp tục tăng mạnh trong 6 tháng đầu năm 2026. Vốn FDI thực hiện đạt 13,03 tỷ USD, tăng 11,2% so với cùng kỳ; vốn FDI đăng ký mới đạt 17,39 tỷ USD, tăng 87,2% so với cùng kỳ.
- Giải ngân đầu tư công được đẩy mạnh dần nhưng chưa đạt kế hoạch. Đầu tư công đạt 335.600 tỷ đồng, tăng 12,7% so với cùng kỳ nhưng mới đạt 31% kế hoạch.
- Tháng 6, Việt Nam đón khoảng 1,68 triệu lượt khách quốc tế, tăng 14,7% so với cùng kỳ. Tính chung 6 tháng đầu năm, lượng khách quốc tế đạt 12,3 triệu lượt, tăng 14,9% so với cùng kỳ.
### Tin doanh nghiệp niêm yết
- GEL: Hạ tầng Gelex ước tính 6 tháng đầu năm 2026 đạt doanh thu 8.000 tỷ đồng, hoàn thành hơn 50% kế hoạch năm. Lợi nhuận dự kiến đạt khoảng 980 tỷ đồng đạt gần 85% mục tiêu lợi nhuận năm 2026.
- DCM: Phân bón Cà Mau (PVCFC) cho biết 6 tháng đầu năm 2026 ghi nhận doanh thu hơn 11.800 tỷ đồng, với tổng sản lượng tiêu thụ vượt 900.000 tấn, hoàn thành trên 59% kế hoạch năm.
- HVN: Vietnam Airlines ước tính KQKD quý II/2026 với mức lỗ khoảng 2.000 tỷ đồng, chủ yếu do áp lực từ giá nhiên liệu tăng cao. Dù vậy, lũy kế 6 tháng đầu năm, hãng vẫn ghi nhận lợi nhuận hợp nhất gần 2.000 tỷ đồng.
- PDV: CTCP Vận tải Dầu khí Thái Bình Dương 6 tháng đầu năm 2026 ước đạt 47 tỷ đồng lợi nhuận trước thuế.
- FOC: CTCP Dịch vụ Trực tuyến FPT thông qua phương án chi trả cổ tức năm 2025 bằng tiền mặt với tỷ lệ 100%, tương ứng 10.000 đồng/cổ phiếu.
- BCG: HOSE thông báo sẽ thực hiện thủ tục hủy niêm yết đối với cổ phiếu BCG của CTCP Tập đoàn Bamboo Capital do vi phạm nghiêm trọng nghĩa vụ công bố thông tin.
- PNJ: PNJ cho biết nguyên Giám đốc P-Lab Đặng Ngọc Thảo bị bắt trong vụ án buôn lậu kim cương xuyên quốc gia là trách nhiệm pháp lý của cá nhân.
- VIC: Ngày 01/07, Tập đoàn Vingroup và các công ty trong hệ sinh thái đồng loạt triển khai 3 công trình hạ tầng tại TP.HCM, với tổng vốn đầu tư dự kiến hơn 93.000 tỷ đồng.
- BVB: BVBank dự kiến ngày hủy đăng ký giao dịch trên UPCoM là 09/07 và đến ngày 21/7 sẽ chính thức giao dịch trên sàn HoSE.
- NTC: Năm 2026, Nam Tân Uyên đặt kế hoạch doanh thu 546 tỷ đồng và LNST hơn 226 tỷ đồng, lần lượt giảm 37% và 30%.
- SAB: Sabeco thông báo ngày 29/7 là ngày đăng ký cuối cùng để nhận cổ tức còn lại năm 2025 bằng tiền mặt, tỷ lệ 30%.
- MBB: Ngân hàng Quân đội thông báo trả cổ tức tiền mặt năm 2025 với tỷ lệ 10% (1.000 đồng/cp), ngày đăng ký cuối cùng là 10/7/2026.
- CII: Nhóm CII tiếp tục nâng tỷ lệ sở hữu tại CTCP Tập đoàn PC1 (PC1) lên 8,97% vốn điều lệ.
- DPR: Năm 2026, Cao su Đồng Phú đặt mục tiêu tổng doanh thu và thu nhập khác đạt 1.067,6 tỷ đồng, tăng 17,3% so với cùng kỳ; LNST 398,5 tỷ đồng, tăng 57,7%.
## Chỉ số VN-Index giảm điểm nhẹ song xu hướng đi ngang trong biên độ hẹp
- Chỉ số VN-Index điều chỉnh nhẹ trở lại trong tuần vừa qua với áp lực chốt lời gia tăng rõ rệt khi một số nhóm cổ phiếu vừa và nhỏ bắt đáy đã có lãi tốt.
- Chỉ số dao động trong biên độ hẹp, xây nền quanh ngưỡng 1.8501.872 điểm tương đương hỗ trợ MA10 theo khung tuần.
- Thanh khoản tiếp tục là điểm nghẽn của thị trường khi vẫn giữ ở mức thấp; tháng 6 vừa qua là tháng có thanh khoản thấp nhất kể từ tháng 1/2025 và khối ngoại vẫn duy trì bán ròng.
## Chỉ số VN-Index xây nền đi ngang và tích lũy trong dải hẹp 1.8401.880 điểm
- Nhìn từ xu hướng đồ thị ngày, chỉ số VN-Index chuyển sang xu hướng xây nền đi ngang và tích lũy trong dải hẹp với biên dao động chính trong khung 1.8401.880 điểm.
- Thanh khoản chưa có dấu hiệu cải thiện rõ rệt và vẫn duy trì ở mức nền thấp.
- Về mặt kỹ thuật, VN-Index đang thể hiện tín hiệu yếu đi trong ngắn hạn khi được xác nhận bởi sự suy giảm của RSI, MACD Histogram thu hẹp và DMI+ chuẩn bị giao cắt xuống dưới DMI-.
## Tóm tắt phân tích kỹ thuật VN-Index
- Về xu hướng: Chỉ số VN-Index giảm nhẹ trở lại và nghiêng về trạng thái tích lũy quanh vùng 1.8501.870 điểm sau khi rung lắc và kiểm nghiệm thành công hỗ trợ 1.845 trong tuần này.
- Với diễn biến hiện tại, khả năng chỉ số sẽ tiếp tục đi ngang trong biên độ hẹp 1.8401.888 điểm trong bối cảnh thanh khoản vẫn yếu và thiếu động lực từ nhóm cổ phiếu dẫn dắt chỉ số.
### Chỉ báo kỹ thuật
| Chỉ báo | Giá trị | Đánh giá |
|---|---:|---|
| RSI(14) | 54.89 | Neutral |
| STOCH(9,6) | 72.55 | Sell |
| Fear & Greed | 26 | Buy |
| MACD(12,26) | 7 | Buy |
| ADX(14) | 18.52 | Buy |
| Williams %R | 30.57 | Buy |
| CCI(14) | 40.87 | Buy |
| Momentum | 38 | Sell |
| ROC | 0.38 | Buy |
### Đường trung bình động
| MA | Giá trị |
|---|---:|
| MA5 | 1,862 |
| MA10 | 1,865 |
| MA20 | 1,835 |
| MA50 | 1,861 |
| MA100 | 1,805 |
| MA200 | 1,764 |
## Thanh khoản toàn thị trường giảm và neo giữ ở nền thấp
- Thanh khoản thị trường tiếp tục là điểm nghẽn trong tuần này khi chỉ số giảm nhẹ và đi ngang trong bối cảnh thị trường phân hóa mạnh.
- Áp lực bán ròng kéo dài từ khối ngoại cũng góp phần khiến tâm lý nhà đầu tư thận trọng, dòng tiền tham gia hạn chế.
- Kết thúc tuần, thanh khoản trung bình toàn thị trường đạt khoảng 18.710 tỷ đồng, giảm khoảng 10% so với tuần trước. Trong đó, thanh khoản khớp lệnh giảm mạnh hơn xuống còn 14.000 tỷ đồng, giảm 6% so với tuần trước.
## Vingroup dẫn sóng phục hồi trong bối cảnh đa phần các nhóm ngành vẫn yếu
- Thị trường tiếp tục đi ngang và phân hóa mạnh, trong đó động lực tăng chủ yếu đến từ các nhóm ngành: Chứng khoán (+2,7%), Logistics (+2,5%), Hàng tiêu dùng (+2,4%), Hàng không (+2,2%), CNTT (+1,6%) và Ngân hàng (+1,4%). Phần còn lại đa số yếu và giảm, trong đó nhóm VinGroup giảm mạnh nhất (-3,2%).
- Thanh khoản tăng tích cực ở Hàng tiêu dùng (+35,9%), BĐS KCN (+23,9%), Chứng khoán (+21,4%), Xây dựng & VLXD (+17,7%). Ngược lại giảm mạnh tại Nông nghiệp (-43,6%), Hóa chất (-38,1%), VinGroup (-37,1%), Thủy hải sản (-31,0%), BĐS (-29,4%), Dầu khí (-25,7%).
- Tóm lại: Thị trường phục hồi chọn lọc, dòng tiền tập trung vào nhóm có cả giá và thanh khoản cùng tăng như Chứng khoán, Hàng tiêu dùng, Logistics, Xây dựng.
## NĐTNN duy trì chuỗi bán ròng sang tuần thứ 12 liên tiếp
- NĐTNN tiếp tục đà bán ròng với chuỗi bán ròng đã kéo sang tuần thứ 12 liên tiếp, với giá trị ròng đạt 2.226 tỷ đồng.
- Trong đó lực bán ròng tập trung chủ yếu tại VHM, HPG, VNM, TCB, GMD. Ở chiều ngược lại họ mua ròng VIC, MCH, HDB, VCB, MWG.
- Tính từ đầu năm đến nay, NĐTNN đã bán ròng 67.900 tỷ đồng, gây áp lực không nhỏ đến diễn biến chung của thị trường.
## Dòng vốn ETF tiếp tục rút ròng thêm -9 triệu USD
- Tuần vừa qua, xu hướng rút ròng trên kênh ETF vẫn chưa dừng lại với mức rút thêm 9,13 triệu USD.
- Rút ròng tiếp diễn tại Fubon FTSE Vietnam ETF với giá trị 4,5 triệu USD và quỹ KIM KINDEX Vietnam VN30 ETF với giá trị 2,4 triệu USD.
- Tổng thể, dòng vốn ETF vào Việt Nam đang ở trong xu hướng rút ròng dài hạn với tổng -534 triệu USD trong 1 năm và -209 triệu USD trong 6 tháng gần nhất.
## Kịch bản thị trường trong ngắn hạn
- **Kịch bản lạc quan (70%)**: Chỉ số VN-Index đi ngang tích lũy trong biên độ dao động hẹp quanh vùng kháng cự/hỗ trợ 1.8401.880 trước khi vượt qua vùng này hướng tới vùng đỉnh cũ 1.9151.930 điểm.
- **Kịch bản thận trọng (30%)**: Nếu chỉ số điều chỉnh và để mất mốc hỗ trợ mạnh tại 1.840, chỉ số có thể bước vào nhịp điều chỉnh thứ cấp với khả năng kiểm nghiệm lại vùng hỗ trợ cứng tại 1.7801.800 điểm.
## Chiến lược đầu tư
- Chiến lược ngắn hạn ưu tiên hành động linh hoạt, tập trung vào cổ phiếu mạnh thay vì chỉ số chung, trong bối cảnh thị trường tiếp tục phân hóa và dòng tiền chọn lọc rõ rệt.
- Giữ vị thế đã có và duy trì tỷ lệ cổ phiếu ở mức hợp lý, ưu tiên nắm giữ các cổ phiếu đã có lãi hoặc đang trong giai đoạn tích lũy tốt, thu hút dòng tiền chọn lọc (nhóm Ngân hàng, Vingroup, một số bluechip và cổ phiếu hưởng lợi từ đầu tư công).
- Đồng thời sẵn sàng chốt lời một phần khi chỉ số tiệm cận kháng cự 1.9001.930 điểm.
- Trong kịch bản thận trọng: nếu chỉ số mất mốc hỗ trợ 1.840 điểm và rơi sâu hơn, khả năng kiểm nghiệm lại vùng 1.8001.780 điểm là có thể xảy ra. Lúc này cần ưu tiên bảo vệ vốn, giảm tỷ trọng cổ phiếu, nâng tỷ lệ tiền mặt lên cao hơn.
## Danh mục theo dõi theo PTKT
> Lưu ý: Nhiều mã đều có cảnh báo Overbought (mức 24). Chiến lược tối ưu: chờ pullback về hỗ trợ thay vì đuổi giá. Quản lý rủi ro: stoploss đề xuất tại -3% đến -5% so với giá mua. Thông tin chỉ mang tính tham khảo kỹ thuật, không phải khuyến nghị đầu tư.
### Top 20 cổ phiếu tiềm năng theo PTKT trong tuần này
| STT | Mã CP | Tên công ty | Ngành | Score | Return 10D | Money Flow 5D | Giá | RS Rating | Rating |
|---|---|---|---|---:|---:|---:|---:|---:|---|
| 1 | PSI | Chứng khoán Dầu khí | Môi giới chứng khoán | 28 | 12.39% | 71% | 10,700 | 97 | Strong Buy |
| 2 | SSB | SeABank | Ngân hàng | 28 | 4.17% | 5% | 16,500 | 93 | Strong Buy |
| 3 | OCB | Ngân hàng Phương Đông | Ngân hàng | 28 | 4.17% | 5% | 11,500 | 88 | Strong Buy |
| 4 | ORS | Chứng khoán Tiên Phong | Môi giới chứng khoán | 28 | 7.64% | 67% | 14,650 | 91 | Strong Buy |
| 5 | VLB | VLXD Biên Hòa | Vật liệu xây dựng & Nội thất | 28 | 2.08% | 100% | 50,000 | 82 | Strong Buy |
| 6 | AGR | Agriseco | Môi giới chứng khoán | 28 | 7.93% | 95% | 16,000 | 90 | Strong Buy |
| 7 | POW | Điện lực Dầu khí Việt Nam | Sản xuất & Phân phối Điện | 28 | 1.98% | 17% | 14,900 | 92 | Strong Buy |
| 8 | BSI | Chứng khoán BIDV | Môi giới chứng khoán | 26 | 3.75% | 55% | 36,500 | 93 | Strong Buy |
| 9 | HVN | Vietnam Airlines | Dịch vụ hàng không | 26 | 8.00% | 24% | 25,300 | 94 | Strong Buy |
| 10 | HDB | HDBank | Ngân hàng | 26 | 3.89% | 33% | 26,950 | 81 | Strong Buy |
| 11 | MCH | Hàng Tiêu Dùng MaSan | Thực phẩm | 26 | 6.03% | 21% | 140,400 | 79 | Strong Buy |
| 12 | MBS | Chứng khoán MB | Môi giới chứng khoán | 26 | 6.02% | 56% | 21,500 | 85 | Strong Buy |
| 13 | VJC | Vietjet Air | Dịch vụ hàng không | 26 | 1.96% | -12% | 141,800 | 83 | Strong Buy |
| 14 | VCK | Chứng Khoán VPS | Môi giới chứng khoán | 26 | 2.49% | -7% | 34,200 | 49 | Strong Buy |
| 15 | TPB | TPBank | Ngân hàng | 24 | 1.38% | 18% | 16,550 | 71 | Strong Buy |
| 16 | VPB | VPBank | Ngân hàng | 24 | 3.04% | 9% | 27,800 | 80 | Strong Buy |
| 17 | VDS | Chứng khoán Rồng Việt | Môi giới chứng khoán | 24 | 10.57% | 98% | 15,900 | 89 | Strong Buy |
| 18 | SHS | Chứng khoán SG-HN | Môi giới chứng khoán | 22 | 3.76% | -17% | 19,300 | 84 | Strong Buy |
| 19 | DSE | Chứng Khoán DNSE | Môi giới chứng khoán | 20 | 2.80% | 49% | 23,100 | 72 | Buy |
| 20 | NAB | Ngân hàng Nam Á | Ngân hàng | 16 | 0.50% | 25% | 13,100 | 89 | Buy |
## Danh mục khuyến nghị từ nền tảng cơ bản
| Mã CP | Giá hiện tại | Giá mục tiêu 12 tháng | Upside |
|---|---:|---:|---:|
| ACB | 22,600 | 30,600 | 35.4% |
| PNJ | 63,500 | 86,100 | 35.6% |
| VHM | 162,000 | 167,560 | 3.4% |
| DGW | 39,100 | 48,000 | 22.8% |
| DBC | 18,500 | 25,900 | 40.0% |
| GEG | 13,700 | 17,250 | 25.9% |
| FRT | 124,000 | 181,000 | 46.0% |
| CTR | 84,500 | 93,500 | 10.7% |
| VNM | 56,300 | 67,200 | 19.4% |
| GMD | 73,000 | 79,100 | 8.4% |
| SIP | 50,100 | 83,500 | 66.7% |
| STB | 73,700 | 63,200 | -14.2% |
| REE | 49,200 | 76,500 | 55.5% |
| MCH | 127,800 | 155,700 | 21.8% |
| PVT | 19,550 | 24,600 | 25.8% |
| HAH | 52,900 | 70,300 | 32.9% |
| CTG | 33,600 | 40,100 | 19.3% |
| TPB | 16,100 | 20,300 | 26.1% |
| BID | 41,700 | 46,300 | 11.0% |
| VIB | 16,150 | 22,999 | 42.4% |
| PVD | 31,600 | 33,800 | 7.0% |
| VCB | 61,400 | 72,800 | 18.6% |
| MBB | 24,750 | 34,200 | 38.2% |
| PVS | 37,500 | 48,200 | 28.5% |
## Lịch sự kiện chứng khoán trong tuần tới
| Ngày GDKHQ | Mã cổ phiếu | Sự kiện |
|---|---|---|
| 07/06/2026 | CLC | Trả cổ tức bằng tiền mặt 25% |
| 07/06/2026 | DIH | Phát hành cổ phiếu 15% |
| 07/06/2026 | VNF | Trả cổ tức bằng tiền mặt 15% |
| 07/07/2026 | VIF | Trả cổ tức bằng tiền mặt 6,97% |
| 07/08/2026 | TVT | Trả cổ tức bằng tiền mặt 10% |
| 07/09/2026 | DCM | Trả cổ tức bằng tiền mặt 20% |
| 07/09/2026 | CTR | Phát hành cổ phiếu 12%, cổ tức tiền mặt 15% |
| 07/09/2026 | STK | Phát hành cổ phiếu 10% |
| 07/09/2026 | ADP | Trả cổ tức bằng tiền mặt 7% |
| 07/09/2026 | TMP | Trả cổ tức bằng tiền mặt 20% |
| 07/09/2026 | BTT | Trả cổ tức bằng tiền mặt 30% |
| 07/09/2026 | TA9 | Phát hành cổ phiếu 14,05% |
| 07/10/2026 | HVT | Trả cổ tức bằng tiền mặt 10% |
| 07/13/2026 | DHA | Trả cổ tức bằng tiền mặt 30% |
| 07/13/2026 | DGC | Đại hội Đồng Cổ đông |
| 07/14/2026 | PVD | Phát hành cổ phiếu 66,9% |
| 07/16/2026 | DVP | Đại hội Đồng Cổ đông bất thường |
| 07/16/2026 | TKU | Trả cổ tức bằng tiền mặt 5% |
| 07/17/2026 | THB | Đại hội Đồng Cổ đông bất thường |
| 07/20/2026 | ICG | Đại hội Đồng Cổ đông bất thường |
| 07/21/2026 | LDP | Đại hội Đồng Cổ đông |
| 07/21/2026 | PIC | Trả cổ tức bằng tiền mặt 10% |
| 07/23/2026 | MHC | Phát hành cổ phiếu 5% |
| 07/23/2026 | IDC | Phát hành cổ phiếu 10%, cổ tức tiền mặt 15% |
| 07/28/2026 | SAB | Trả cổ tức bằng tiền mặt 30% |
| 07/28/2026 | NTH | Trả cổ tức bằng tiền mặt 15% |
## Miễn trừ trách nhiệm
Các thông tin, số liệu thống kê và khuyến nghị trong bản báo cáo này, bao gồm cả các nhận định cá nhân, được dựa trên các nguồn thông tin công bố đại chúng theo quy định của pháp luật, hoặc các nguồn thông tin mà đơn vị phát hành cho rằng đáng tin cậy tính đến thời điểm phát hành báo cáo. Báo cáo được lập với mục đích dự báo, cảnh báo những rủi ro tiềm ẩn có thể xảy ra, được sử dụng như thông tin tham khảo trong nội bộ VPBankS và VPBank. Bản quyền báo cáo thuộc về VPBankS, mọi hành vi sao chép, sửa đổi từng phần hoặc toàn bộ báo cáo là vi phạm bản quyền.
## Thông tin liên hệ
+7 -3
View File
@@ -23,9 +23,13 @@ kill_etcds()
start_etcd 3
}
kill_etcds &
$VITASTOR_FIO -bs=4k -direct=1 -iodepth=1 -fsync=1 -rw=randwrite \
-pool=1 -inode=1 -size=128M -cluster_log_level=10 -runtime=30
-pool=1 -inode=1 -size=128M -cluster_log_level=10 -runtime=30 &
FIO_PID=$!
# Kill in foreground because otherwise antietcds are not killed by jobs -p
kill_etcds
wait $FIO_PID
format_green OK