[0] https://en.wikipedia.org/wiki/Raspberry_Pi#Specifications
[1] https://en.wikipedia.org/wiki/ARM11#Overview
[2] https://en.wikipedia.org/wiki/ARM11
[3] https://en.m.wikipedia.org/wiki/Comparison_of_ARMv8-A_cores
1,283 karma · joined July 5, 2012
[0] https://en.wikipedia.org/wiki/Raspberry_Pi#Specifications
[1] https://en.wikipedia.org/wiki/ARM11#Overview
[2] https://en.wikipedia.org/wiki/ARM11
[3] https://en.m.wikipedia.org/wiki/Comparison_of_ARMv8-A_cores
It might help to read skeeto's blogs [0][1][2].
[0] https://nullprogram.com/blog/2015/03/19/
I love me some HAProxy too, but it only operates at the level of a single service/backend group or lists of relatively independent services/backend groups. Services Meshes intend to make deploying dozens, hundreds, thousands of complex services in cohesive and consistent fashions such that they form one or more applications or APIs.
[0] https://docs.openshift.com/container-platform/4.5/service_me...
BTW, Windows benchmarks tend to follow same pattern of FAT32 being slower than newer filesystems. [2][3][4]
[0] https://www.phoronix.com/scan.php?page=article&item=linux_us...
[1] https://web.archive.org/web/20010627181258/http://bulma.lug....
[2] https://www.flexense.com/fat32_exfat_ntfs_usb3_performance_c...
[3] https://www.sami-lehtinen.net/blog/exfat-fat32-ntfs-real-lif...
[4] https://www.tomshardware.com/reviews/ssd-file-system-ntfs,31...
[0] http://www.mdgx.com/mem6.htm#6
[1] http://manmrk.net/tutorials/DOS/msdos7/emm386.htm
[2] https://en.m.wikipedia.org/wiki/Unreal_mode
[3] https://github.com/charliesome/doslinux/blob/master/doslinux...
[0] https://en.m.wikipedia.org/wiki/Unreal_mode
[1] https://github.com/charliesome/doslinux/blob/master/doslinux...
Personally, at some point, I'd like to write a Pratt Parser in C99. I'd like to explore the one sentiment you had that OOP has a negative effect on understanding Pratt Parsers.
I hear you though, there are many that (overly) use passive-aggressive and/or aggressive language in the form of acronyms like STFU, GTFO, RTFA, IDC, WTH, WTF etc. Not my intent. I sometimes use TFA as a reference to the linked article. I'll reconsider next time.
People seem to have inferred that I believe that Limits are used by the Scheduler. I don't. But if we set "Request = Limits", we're guaranteeing to the Scheduler that our pod workload will never need more than what is Requested, or, we scale up to a new pod.
It seems to me latency is a symptom of the actual issue, not the actual problem.
If a workload idles at 25% of Request, 12.5% of Limits (as in TFA), and peaks at 50% of Request, 25% of Limits that seems hugely wasteful. What's more, the workload has several "opportunities" to optimize latency. And uncapping the CPU Limit reduces the latency. If it were me, I'd be asking, "Why does my workload potentially need access to (but not utilization?) 4, 6, 8, 16, 32 cores to reduce its latency?"
More often than not, I've been able to help customers reduce their latency by DECREASING the Pod's Requests and Limits, but also INCREASE the replica count (via HPA or manually). It's not a silver bullet, and whether a workload is node.js, JBoss EAP, Spring Boot, or Quarkus does matter to some extent. The first thing I reach for in my k8s toolbox is to scale out. "Many hands make light work" is an old adage. N+1 workloads can usually respond to more traffic than N workloads in a shorter amount of time. k8s' strength is that it is networked and clustered. Forcing one node or a set of nodes to work harder (TFA mentions "isolating" the workload) or vertically scaling is anti-pattern in my book. Especially when you understand the workload pattern well. What is being done here is that nodes (which are likely VMs) are being over-committed [0]. Now, those VMs live on physical hypervisors which are likely -guess what- over-committed. Turtles of (S)POFs all the way down I say.
Also, TFA mentions
In the past we’ve seen some nodes going to a "notReady" state, mainly because some services were using too much resources in a node.
and The downsides are that we lose in “container density”, the number of containers that can run in a single node. We could also end up with a lot of “slack” during a low traffic time. You could also hit some high CPU usage, but nodes autoscaling should help you with it.
So they acknowledge the risk is real and they've encountered it. For most of my customers, failing nodes, reduced "container density", and "slack" are unacceptable. That translates into increased engineer troubleshooting time, higher cloud provider bills. What's worse is that the suggestion of the Cluster Autoscaler will protect you also comes with increased costs (licenses, VM, storage, etc.). Not the solution I want. Seems like a blank check to your cloud provider.But I get it. I've fought with customers that tell me, "By removing the Limit, my container starts up in half the time." Great. Then they get to Perf Testing and they get wildly inconsistent speed up when scaling out (or way sublinear), or they're limited by resource in their ability to scale up especially when metrics tells them they have resources available, or there is unchecked backpressure, or downstream bottlenecks, or this one workload ends up consuming an entire worker node, or ...
[0] https://www.openshift.com/blog/full-cluster-part-2-protectin...
This is such a bad idea. And I get that they're point is to reduce latency. But the point of k8s is describe your workload accurately and allow it to make decisions on your behalf. The no-brainer way fix this is to set the CPU Requests and Limits to the same value and add an HPA. Setting CPU Requests and Limits to the same value usually gives people the behavior they're expecting. Having more pods in can also reduce latency. But, taking away the Limits hides information about the workload while working around the issue at low to medium workloads. If they were ever to get Black Friday or other 2.5x workload peaks, I'd worry that the Limits removal would cause k8s not to be able to schedule the workload appropriately even if they had enough resources on paper. Remember, the idea of k8s is to scale atomically and horizontally while ensuring availability. If you're making something vertically scale, you'd likely want to re-evaluate that workload.
Depending on the ISA [3][4][5], there can be jumps, branches, and subroutine transfers (or even a subset of those). Some can be based (conditional) on what value is in a primary register (often traditionally called the accumulator), a condition/flag/status register, a memory location, and even well known constants (0, 1, -1). Many ISAs have ways branching to a function/subroutine/procedure that can include adjusting a calling stack or transferring control to an OS kernel. x86 is notable in that you can cause a branch or jump without calling a branch or jump instruction.
[0] https://www.tutorialspoint.com/assembly_programming/assembly...
[1] https://thinkingeek.com/2013/01/19/arm-assembler-raspberry-p...
[2] https://www.ibm.com/developerworks/library/l-powasm3/index.h...
[3] https://en.wikipedia.org/wiki/Instruction_set_architecture
[0] https://github.com/lpsantil/rt0/blob/master/src/lib/00_start...